2013-04-01 9 views
14

Chciałbym użyć czegoś takiego jak reverse_each_with_index w tablicy.Ruby array reverse_each_with_index

Przykład:

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

widzę, że Ruby ma each_with_index ale nie wydaje się mieć odwrotny. Czy jest inny sposób na zrobienie tego?

+0

Czy możesz mi powiedzieć, jakie wyjście chcesz mieć? –

+0

Czy pytasz, jak użyć (nie) istniejącej metody o nazwie 'reverse_each_with_index', czy chcesz zaimplementować taką, która ma określoną funkcję? Różne części twojego pytania sugerują jedno lub drugie. – sawa

Odpowiedz

17

Pierwszy reverse tablicy, a następnie użyj each_with_index:

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

Chociaż indeksy pójdą z 0 do length - 1, a nie na odwrót.

+2

ale możesz po prostu "length-index-1", aby uzyskać odwrócony indeks ... – meta

2

Wystarczy

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

Dobrze, ponieważ Ruby zawsze lubi daje opcje można nie tylko zrobić:

arr.reverse.each_with_index do |e, i| 

end 

ale można też zrobić:

arr.reverse_each.with_index do |e, i| 

end 
+0

Spodziewałbym się, że '.reverse_each.with_index' będzie szybszy, ponieważ' .reverse_each' jest szybszy niż '.reverse.each'' . Dlatego użyłbym '.reverse_each.with_index' i sam odwróciłem indeksy lub użyłem odwróconego indeksu jako negatywnego wyszukiwania tablicy. Chociaż krótkie eksperymenty nie wykazały dużej różnicy w moim odczuciu. –

39

Jeśli chcesz prawdziwy indeks elementu w tablicy można wykonać:

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

wyjściowa:

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

Można również zdefiniować własne metody reverse_each_with_index

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 

Zoptymalizowana wersja

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

bez kopiowania tablicy:

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