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