获取ruby函数对象本身
在Ruby中,一切都应该是一个对象。 但是我有一个很大的问题,就是通常的方式来定义函数对象
def f "foo" end
与Python不同,f是函数结果,而不是函数本身。 因此, f()
, f
, ObjectSpace.f
都是"foo"
。 f.methods
返回字符串方法列表。
如何访问函数对象本身?
您只需使用method
方法。 这将返回与该方法匹配的Method
实例。 一些例子:
>> def f >> "foo" >> end => nil >> f => "foo" >> method(:f) => # >> method(:f).methods => [:==, :eql?, :hash, :clone, :call, :[], ...] >> class SomeClass >> def f >> "bar" >> end >> end => nil >> obj = SomeClass.new => # >> obj.method(:f) => # >> obj.method(:f).methods => [:==, :eql?, :hash, :clone, :call, :[], ...]
希望这可以帮助。
方法method
将为您提供一个Method
对象
f = obj.method :f puts f.call # or f[]
这个f
必然是obj。 您还可以获得未绑定的方法:
unbound_plus = Fixnum.instance_method('+') plus_2 = unbound_plus.bind(2)
(还有一种解除绑定的方法)
好吧,我自己找到了答案
obj = method :f
谢谢大家的灵感:)
在Ruby中,你要求的东西没有意义。 (在Python,JavaScript,Java和C#等语言中都有意义。)
在Ruby中,您可以告诉类它应该响应哪些消息以及它应该以什么方式响应这些消息。 告诉类在类中定义方法的最常用方法。 但同样,这只是意味着:当有人将消息f
发送到此实例时,这是实例应该响应的行为。 没有function对象。
您可以执行诸如获取符号( method_name = :foo
)和获取闭包( method = proc { obj.foo }
)之类的操作。
那不是一个function; 它是一个对象的方法。 如果要获取表示方法的对象,请向拥有对象询问:
someobj.method :f
例如:
plus_one = 1.method :+ plus_one[9] # 10
你可以在运行时获得一个与该函数对应的对象,但据我所知,在函数/类定义中没有Python允许你做的事情。
希望有人会certificate我错了,但我从来没能把它拉下来。
如果需要函数对象,则应创建Proc
对象
f = Proc.new { |x| x * 2 }
你用任何一个调用函数
f.call(8) # => 16
要么
f[8] # => 16
你甚至可以在map
操作中使用这个function对象
[1, 2, 3, 4, 5].map(&f) # => [2, 4, 6, 8, 10]