Przejrzałem to i otrzymałem niejednoznaczne / sprzeczne opinie - czy faktycznie jest jakaś różnica między robieniem map
a robieniem collect
na tablicy w Ruby / Rails?
W docs nie wydają się sugerować, istnieją, ale są tam może różnice w sposobie lub wydajności?
map
jest preferowany w Code Golf .map
jest preferowany w CodeGolf, co może nie być oczywiste dla wszystkich: dzieje się tak tylko dlatego, żecollect
cztery znaki są dłuższe niżmap
, ale funkcjonalne.collect
bardziej czytelny i naturalny - pomysł „gromadzenia” nagrań i robienia z nimi X ma dla mnie bardziej naturalny sens niż „mapowanie” nagrań i robienie z nimi X.Odpowiedzi:
Nie ma różnicy, w rzeczywistości
map
jest zaimplementowane w C jakorb_ary_collect
ienum_collect
(np. Istnieje różnica międzymap
tablicą a dowolnym innym wyliczeniem, ale nie ma różnicy międzymap
icollect
).Dlaczego oba
map
icollect
istnieją w Ruby?map
Funkcja ma wiele nazewnictwa w różnych językach. Wikipedia zawiera przegląd :Ruby zapewnia alias dla programistów ze świata Smalltalk, aby czuli się jak w domu.
Dlaczego istnieje inna implementacja tablic i wyliczeń? Wyliczenie jest uogólnioną strukturą iteracyjną, co oznacza, że Ruby nie jest w stanie przewidzieć, jaki może być następny element (możesz zdefiniować nieskończone wyliczenia, patrz przykład Prime ). Dlatego musi wywoływać funkcję, aby uzyskać każdy kolejny element (zazwyczaj będzie to
each
metoda).Tablice są najczęstszą kolekcją, więc rozsądne jest zoptymalizowanie ich wydajności. Ponieważ Ruby wie dużo o tym, jak działają tablice, nie musi wywoływać,
each
ale może używać tylko prostej manipulacji wskaźnikiem, która jest znacznie szybsza.Podobne optymalizacje istnieją dla wielu metod Array, takich jak
zip
lubcount
.źródło
count
,length
lubsize
. Różne słowa dla tego samego atrybutu tablicy, ale przez to, Ruby pozwala wybrać najbardziej odpowiednie słowo w kodzie: chcesz się szereg elementów jesteś zbieranie The długość tablicy, czy obecna wielkość od struktura. Zasadniczo wszystkie są takie same, ale wybranie odpowiedniego słowa może ułatwić odczytanie kodu, co jest przyjemną właściwością języka.Powiedziano mi,że są takie same.W rzeczywistości są one udokumentowane w tym samym miejscu pod ruby-doc.org:
http://www.ruby-doc.org/core/classes/Array.html#M000249
źródło
Zrobiłem test porównawczy, aby spróbować odpowiedzieć na to pytanie, a następnie znalazłem ten post, więc oto moje ustalenia (które różnią się nieznacznie od innych odpowiedzi)
Oto kod testu porównawczego:
A wyniki, które uzyskałem były:
Być może alias nie jest bezpłatny?
źródło
collect
Icollect!
metody są aliasymap
imap!
, więc mogą być używane zamiennie. Oto prosty sposób, aby potwierdzić, że:źródło
Ruby aliasuje metodę Array # map do Array # collect; mogą być używane zamiennie. (Ruby Monk)
Innymi słowy, ten sam kod źródłowy:
http://ruby-doc.org/core-2.2.0/Array.html#method-i-map
źródło