2012-02-27 18 views

Odpowiedz

73

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.

+5

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

+0

@ sepp2k: Tak, zapomniałem "&" tam. –

+0

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

1

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.