2012-10-19 17 views
5
a = [3, 4, 7, 8, 3] 
b = [5, 3, 6, 8, 3] 

Zakładając tablice o tej samej długości, czy istnieje sposób użycia each lub innego idiomatycznego sposobu uzyskania wyniku z każdego elementu obu tablic? Bez użycia licznika?Czy istnieje idiomatyczny sposób działania na 2 tablicach w Ruby?

Na przykład, aby uzyskać produkt o każdym elemencie: [15, 12, 42, 64, 9]

(0..a.count - 1).each do |i| jest tak brzydki ...

Ruby 1.9.3

Odpowiedz

4

Ze względów wydajnościowych, zip może być lepszy, ale transpose zachowuje symetrię i jest łatwiejszy do zrozumienia.

[a, b].transpose.map{|a, b| a * b} 
# => [15, 12, 42, 64, 9] 

Różnica między zip i transpose jest to, że w przypadku tablice nie mają taką samą długość, byłego wkładki nil jako domyślny podczas gdy druga zgłasza błąd. W zależności od sytuacji możesz faworyzować jedną nad drugą.

6

Co na temat korzystania Array.zip:

>> a = [3,4,7,8,3] 
=> [3, 4, 7, 8, 3] 
>> b = [5,3,6,8,3] 
=> [5, 3, 6, 8, 3] 
>> c = [] 
=> [] 
>> a.zip(b) do |i, j| c << i * j end 
=> [[3, 5], [4, 3], [7, 6], [8, 8], [3, 3]] 
>> c 
=> [15, 12, 42, 64, 9] 

Uwaga: Jestem bardzo nie programista Ruby więc apolo gize za wszelkie idiomy, które zdeptałem.

+0

zamierzałem to napisać. tak to zrobię :) – Castilho

+0

@Castilho: moja pierwsza myśl była, cholera ... Ruby musi mieć gdzieś metodę "zip". Pochodzę z ziemi Pythona, więc znalezienie jej zajęło kilka sekund. –

+4

Klamry są zwykle używane z jednolinijkowymi ('a.zip (b) .each {| i, j | c << i * j}'), ale to nie jest dokładnie * deptanie *. A "map" będzie bardziej odpowiednie w tym konkretnym przypadku: 'c = a.zip (b) .map {...}' –

Powiązane problemy