在Ruby中,有一个“方法”方法,它创建一个方法对象,然后可以将其视为Proc。如果你想进行元编程,这很有用:
def foobar(method_as_a_string)
2.method(method_as_a_string).call(2)
end
foobar("+")
=> 4
foobar("-")
=> 0
但是,通常情况下,如果你想进行这样的元编程,你可以使用send
代替方法......
def foobar(method_as_a_string)
2.send(method_as_a_string, 2)
end
foobar("+")
=> 4
foobar("-")
=> 0
Ruby中的“方法”方法有什么意义?
答案 0 :(得分:6)
Method
对象提供各种内省和元编程,包括:
你如何以及使用这些权力取决于你。
对于卡里,下面:
"cat".method(:count).receiver
# => "cat"
答案 1 :(得分:5)
您可以将method
结果传递给一个块,它将调用传递iteratee 作为参数的方法。
例如,这不起作用:
[1,2,3].each(&:puts)
因为它正在调用1.puts
,2.puts
等。但这会:
[1,2,3].each(&method(:puts))
另一个例子:
arr, result = [1,2,3], []
arr.each &result.method(:push)
result # => [1,2,3]
答案 2 :(得分:3)
元编程还有其他方面,而不仅仅是直接使用方法。我最近写了一些代码,需要确定一个方法实际定义在哪个类中。
这是一个简单的例子:
class Foo
def bar
puts "bar"
end
end
# to get the owner of bar method here
Foo.new.method(:bar).owner
我正在处理许多类扩展单个类的场景,在该单个类中,我需要知道为跟踪目的定义了哪个方法。我在Rails应用程序中为每个方法在before_filter中写了这个。
这是我唯一一次直接需要#method。
答案 3 :(得分:3)
我经常在寻找文档时使用它。
举个例子:
[1, 2, 3, 4, 5, 6].slice_after{|x| x.odd? }
接收器是一个数组,但Array doc中没有slice_after
。
这意味着slice_after
定义在:
Array.ancestors
#=> [Array, Enumerable, Object, Kernel, BasicObject]
而不是查看这些类的文档:
[1, 2, 3, 4, 5, 6].method(:slice_after)
#=> #<Method: Array(Enumerable)#slice_after>
因此该方法在Enumerable中定义,并可供Array对象使用。