2012-03-06 14 views
22

Powiel możliwe:
Ruby - What is the difference between map, each and collect?Różnica między mapą a każdym

Szukałem w Ruby-Doc również, ale nie mogę zrozumieć różnicę między

map 
each 

iteratorów. Byłoby wspaniale, gdybyś mógł podać przykład i wyjaśnić.

+0

... a oprócz odpowiedzi Andrew i Bryana dodam, że istnieje inna metoda o nazwie * collect *, która jest dokładnie taka sama z * map *;) –

+0

Yup, 'map' i' collect' są równoważne. Chociaż nigdy nie lubiłem nazwy "zbieram", ponieważ nie sądzę, że naprawdę opisuje to, co robi bardzo dobrze. –

Odpowiedz

64

each po prostu iteruje po danym przeliczalnym, uruchamiając blok dla każdej wartości. To odrzuca wartości zwracanej bloku, i każdy po prostu zwraca oryginalny obiekt był nazywany na:

[1, 2, 3].each do |i| 
    i + 1 
end # => [1, 2, 3] 

To jest po prostu ładniejszy, bardziej uniwersalny sposób robienia tradycyjnych Iteracja for pętlę i each jest znacznie preferowane ponad for pętli w Ruby (w rzeczywistości, nie sądzę, że kiedykolwiek użyłem pętli for w Ruby).

map jednak iteracje nad każdym elementem, przy użyciu wartości zwracanej bloku zapełnić nową tablicę na każdym odpowiednim indeksie i powrotu tej nowej tablicy:

[1, 2, 3].map do |i| 
    i + 1 
end # => [2, 3, 4] 

więc „mapy” każdy element do nowy za pomocą podanego bloku, stąd nazwa "mapa". Zauważ, że ani each, ani map same nie modyfikują oryginalnej kolekcji.

+2

Warto podkreślić, że nie ustawia żadnych wartości w kolekcji * original *; tylko w zwróconej kopii. – SasQ

+0

_ "ustawia bieżący element, który jest iterowany, na wartość zwracaną" _ brzmi tak, jakby bieżący element został zastąpiony przez wartość bloku.I "z tymi zmianami" akcenty, że coś się zmienia. To byłoby dobre wytłumaczenie dla 'Array # map!' (Z hukiem). 'map' z drugiej strony (oba,' Wymienna # mapa' i 'Tablica # mapa') zwraca nową tablicę (zawsze jest to tablica, niezależnie od podanego odbiorcy), zawierającą wartości zwracane przez blok bez zmiany odbiornika. – Stefan

+1

@Stefan Widzę zamieszanie, mam nadzieję, że aktualizacja trochę wyjaśnia (napisano to * długo * temu!). –

7

zwraca oryginalny obiekt. Służy do uruchamiania operacji przy użyciu każdego elementu tablicy bez gromadzenia jakichkolwiek wyników. Na przykład, jeśli chcesz wydrukować listę numerów, można zrobić coś takiego:

arr = [1, 2, 3, 4] 
arr.each { |n| puts n } 

teraz, że puts metoda powyżej faktycznie zwraca nil. Niektórzy ludzie o tym nie wiedzą, ale i tak nie ma to większego znaczenia; nie ma żadnego powodu, aby zebrać tę wartość (jeśli chciał konwertować arr na łańcuchy, należy używać arr.map(&:to_s) lub arr.map { |n| n.to_s }.


map zwraca wyniki bloku z przechodzeniem do niego. Jest to świetny sposób, aby uruchom operację na każdym elemencie w tablicy i pobierz wyniki:. Jeśli chcesz wybrać wiele elementów tablicy przez 2, to jest to naturalny wybór, jako bonus możesz modyfikować oryginalny obiekt za pomocą map!. :

arr = [1, 2, 3, 4] 
arr.map! { |n| n * 2} 
# => [2, 4, 6, 8] 
Powiązane problemy