2015-02-20 6 views
5

Ten działa:Nadanie wysyłania metody obiektu inny sposób z bloku

Beer.all.send(:sort) 

a także współpracuje z bloku:

Beer.all.sort_by{|b| b.name} 
Beer.all.sort_by(&:name) 

Ale kiedy daję wykonywalny blok wysyłanie sposób jak to:

Beer.all.send(:sort_by{|b| b.name}) 
Beer.all.send(:sort_by(&:name)) 

Dostaję błąd składni. Czy istnieje inny sposób w Ruby, aby dać wykonywalny blok do metody wysyłania?

+0

Proszę przeczytać Ruby najpierw wiedzieć, jak pracować Produkty –

+0

Jeśli chcesz przekazać argument do metody, to jest to zazwyczaj niemożliwe. –

+2

Czy myślisz, że ': sort_by {| b | b.name} 'jest poprawnym obiektem' Symbol' Rubiego? –

Odpowiedz

4

Należy spróbować czegoś takiego:

Beer.all.send(:sort_by) {|b| b.name} 
0

Bloki są specjalne argumenty Ruby, nie są one przekazywane wraz z regularnych argumentów w nawiasach. Nie ma to nic wspólnego z send. send to po prostu metoda jak każda inna metoda, w końcu nie może zmienić składni Rubiego.

Bloki są przekazywane po wszystkie inne argumenty, to znaczy tak:

foo.bar(baz, qux) {|sillyname| do_stuff }