Ruby'de each.with_index ve each_with_index arasındaki fark?


97

Gerçekten arasındaki fark hakkında kafam karıştı each.with_indexve each_with_index. Farklı türleri var ama pratikte aynı görünüyorlar.


7
Kenara hafif farktan with_indexofset, bir başlangıç endeksi izin verir with_indexile bağlantılı olarak kullanıldığında, genel olarak tercih edilir map, reduce, collectvb Kısaca, map.with_indexdaha iyi okur each_with_index.map. Bir anlamda, birlikte kullanıldığında map, var olmayan map_with_indexyöntemin yerini alır.
— Cary Swoveland

Yanıtlar:


175

with_indexYöntem, başlangıç endeksi dengelemek için isteğe bağlı bir parametre alır. each_with_indexaynı şeyi yapar, ancak isteğe bağlı bir başlangıç ​​dizini yoktur.

Örneğin:

[:foo, :bar, :baz].each.with_index(2) do |value, index|
    puts "#{index}: #{value}"
end

[:foo, :bar, :baz].each_with_index do |value, index|
    puts "#{index}: #{value}"
end

Çıktılar:

2: foo
3: bar
4: baz

0: foo
1: bar
2: baz

42

each_with_indexRuby'ye daha önce tanıtıldı. with_indexdaha sonra tanıtıldı:

  1. çeşitli numaralandırıcılarla daha geniş kullanıma izin vermek.
  2. dizinin dışında bir sayıdan başlamasına izin vermek için 0.

Bugün, kullanmak with_indexgenellik ve okunabilirlik açısından daha iyi olurdu, ancak kodu hızlandırma açısından each_with_indexbiraz daha hızlı çalışıyor each.with_index.

Tek bir yöntemin birkaç yöntemin doğrudan zincirlenmesiyle kolayca ifade edilebileceğini düşündüğünüzde, genellikle tek yöntemin zincirden daha hızlı olduğu durum söz konusudur. Bunun başka bir örneğine gelince, reverse_eachdaha hızlı çalışır reverse.each. Bu yöntemlerin var olma nedenleri vardır.


1
Adil olmak gerekirse, ofset endeksi değiştirmez, sadece dizine bir sayı ekler. Aramanızdan sonra dizini kontrol ettiğinizde, etkilenmediğini göreceksiniz. Her zamanki gibi güzel notlar, @sawa
— vgoff

2
Performansın farklı olması gerektiğini düşünmüyorum (en azından önemli ölçüde değil). Olarak reverse, örneğin, reversebir dizi, ve sayimm dönüyor. Bir numaralandırıcı döndürdüyse, iyi bir uygulama ile daha yavaş olmaması gerekirdi.
— akostadinov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.