Powiel możliwe:
What does map(&:name) mean in Ruby?Co oznacza Post.all.map (&: id)?
Post.all.map(&:id)
powróci
=> [1, 2, 3, 4, 5, 6, 7, ................]
Co map(&:id)
oznacza? Zwłaszcza &
.
Powiel możliwe:
What does map(&:name) mean in Ruby?Co oznacza Post.all.map (&: id)?
Post.all.map(&:id)
powróci
=> [1, 2, 3, 4, 5, 6, 7, ................]
Co map(&:id)
oznacza? Zwłaszcza &
.
Symbol &
służy do oznaczenia, że poniższy argument powinien być traktowany jako blok dany danej metodzie. Oznacza to, że jeśli nie jest jeszcze obiektem Proc, jego metoda to_proc
zostanie wywołana w celu przekształcenia go w jeden.
Zatem Twój przykład wyniki w coś
Post.all.map(&:id.to_proc)
który z kolei jest równoznaczne z
Post.all.map { |x| x.id }
Więc iteracje nad kolekcji zwrócony przez Post.all
i buduje tablicę z wynikiem metoda id
wywołała każdy element.
Działa to, ponieważ Symbol#to_proc
tworzy Proc, który pobiera obiekt i wywołuje metodę z nazwą symbolu na nim. Jest używany głównie dla wygody, aby zaoszczędzić trochę pisania.
To nie jest prawda. map (: id.to_proc) rzuci ArgumentError, ponieważ mapa nie przyjmuje żadnych argumentów. Przekazanie Proc jako argumentu jest ** nie ** takie samo jak dostarczenie bloku. To, co "i" robi, przekształca Proc w blok i jeśli operand nie jest procem, najpierw wywołuje to_proc, a następnie zamienia wynik na blok. – sepp2k
@ sepp2k: Tak, zapomniałem "&" tam. –
Twoje pierwsze zdanie powinno również przeczytać coś w rodzaju "' & x "jest takie samo jak' & x.to_proc' "- z tą różnicą, że definicja jest nieskończenie rekursywna. – sepp2k
To zajmuje wszystkie obiekty Post
i tworzy tablicę z wywoływaną metodą id
na każdym z nich.
Innymi słowy, dla ActiveRecord, oznacza to, że otrzymujesz tablicę z atrybutem id
dla wszystkich Post
podmiotów w bazie danych.
Jest to sztuczka typu Ruby, która polega na Ruby, która dokonuje konwersji typu dynamicznego. Możesz znaleźć objaśnienie Symbol#to_proc trick here.
& oznacza, że przechodzą blok
Post.all jest odbiorca metodzie .map, a jego blok jest przekazywana
Post.all.map { |item| # do something }
http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-map
To iteruje tablicę i utwórz znak lambda z symbolem # to_proc
dzięki za zamknięte jako dokładny duplikat. To pytanie jest trochę trudne do wyszukania. Przepraszam. –