2013-04-01 6 views
14

Dizide reverse_each_with_index gibi bir şey kullanmak isterim.Ruby dizisi reverse_each_with_index

Örnek: Ben Ruby each_with_index vardır ancak bir de tam tersi bir görünmüyor görüyoruz

array.reverse_each_with_index do |node,index| 
    puts node 
    puts index 
end 

. Bunu yapmanın başka bir yolu var mı?

+0

Çıktının ne olmasını istediğinizi söyleyebilir misiniz? –

+0

"reverse_each_with_index" adlı bir (non-) varolan yöntemin nasıl kullanılacağını mı yoksa belirli bir işlevi olan bir nesneyi uygulamak mı istiyorsunuz? Sorunuzun farklı bölümleri birini veya diğerini ima eder. – sawa

cevap

17

İlk reverse dizisi ve ardından each_with_index kullanın:

array.reverse.each_with_index do |element, index| 
    # ... 
end 

rağmen endeksleri, 0 den length - 1 gitmek tersi değil edecektir.

+2

ancak ters indeksi de almak için sadece 'length-index-1' yapabilirsiniz ... – meta

2

Basitçe

arr.reverse.each_with_index do |node, index| 
7

Yakut hep size seçenekler vermeyi sever Eh beri yalnızca yapamaz:

arr.reverse.each_with_index do |e, i| 

end 

ama aynı zamanda yapabilirsiniz:

arr.reverse_each.with_index do |e, i| 

end 
+0

' .reverse_each.with_index' daha hızlı olmasını beklerim çünkü '.reverse_each'' .reverse.each'den daha hızlıdır . Bu nedenle, '.reverse_each.with_index' komutunu kullanıyorum ve indeksleri kendim tersine çeviririm ya da ters çevrilmiş endeksi negatif dizi araması olarak kullanırdım. Kısa deneyler irb'de büyük bir farklılık göstermese de. –

39

İsterseniz Dizideki öğenin gerçek dizini bunu

yapabilir
['Seriously', 'Chunky', 'Bacon'].to_enum.with_index.reverse_each do |word, index| 
    puts "index #{index}: #{word}" 
end 

Çıktı:

index 2: Bacon 
index 1: Chunky 
index 0: Seriously 

Ayrıca tanımlayabilirsiniz kendi reverse_each_with_index yöntemi

class Array 
    def reverse_each_with_index &block 
    to_enum.with_index.reverse_each &block 
    end 
end 

['Seriously', 'Chunky', 'Bacon'].reverse_each_with_index do |word, index| 
    puts "index #{index}: #{word}" 
end 

kopyalama dizinin olmadan Optimize edilmiş versiyonu

class Array 
    def reverse_each_with_index &block 
    (0...length).reverse_each do |i| 
     block.call self[i], i 
    end 
    end 
end 
0

:

(array.size - 1).downto(0) do |index| 
    node = array[index] 
    # ... 
end