获取Ruby函数对象本身

Getting ruby function object itself

在Ruby中,一切都应该是一个对象。但是我有一个很大的问题,就是要用通常的方法来定义函数对象,比如

1
2
3
def f
   "foo"
end

与Python不同,F是函数的结果,而不是函数本身。因此,f()fObjectSpace.f均为"foo"。另外,f.methods只返回字符串方法列表。

如何访问函数对象本身?


您只需使用method方法。这将返回与该方法匹配的method实例。一些例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>> 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, :[], ...]

希望这有帮助。


方法method将给您一个method对象

1
2
f = obj.method :f
puts f.call # or f[]

这个f与obj有关。还可以获取未绑定的方法:

1
2
unbound_plus = Fixnum.instance_method('+')
plus_2 = unbound_plus.bind(2)

(还有一种解绑方法)


我自己也找到了答案

1
obj = method :f

感谢大家的启发:)


这不是一个函数,而是一个对象的方法。如果要获取表示方法的对象,请向其所属对象询问:

1
someobj.method :f

例如:

1
2
plus_one = 1.method :+
plus_one[9] # 10


在Ruby中,你所要求的没有意义。(在Python、JavaScript、Java和C语言等语言中,它是有意义的)。

在Ruby中,您可以告诉类它应该响应什么消息,以及应该以什么方式响应这些消息。告诉类的最常见方法是在类中定义方法。但同样,这仅仅意味着:当有人向这个实例发送消息f时,这是该实例应该响应的行为。没有函数对象。

你可以做一些事情,比如得到一个符号(method_name = :foo)和一个闭包(method = proc { obj.foo })。


如果需要函数对象,则应创建一个Proc对象

1
f = Proc.new { |x| x * 2 }

您可以使用

1
f.call(8) # => 16

1
f[8] # => 16

甚至可以在map操作中使用此函数对象

1
[1, 2, 3, 4, 5].map(&f) # => [2, 4, 6, 8, 10]


您可以获得一个在运行时对应于该函数的对象,但据我所知,在函数/类定义中没有与Python允许您做的相同的事情。

希望有人能证明我是错的,但我从来没有成功过。