使用块为对象的send-method提供另一种方法

时间:2015-02-20 13:30:59

标签: ruby-on-rails ruby metaprogramming

这个有效:

Beer.all.send(:sort)

并且它也适用于块:

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

但是当我给这样的send-method提供一个可执行块时:

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

我收到语法错误。 Ruby中是否有任何替代方法可以为send-method提供可执行块?

2 个答案:

答案 0 :(得分:5)

你应该尝试类似的东西:

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

答案 1 :(得分:1)

块是Ruby中的特殊参数,它们不与括号内的常规参数一起传递。这与send没有任何关系。 send只是一个像任何其他方法一样的方法,毕竟它不能改变Ruby的语法。

在所有其他参数之后传递块,例如:

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