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.