如何使对象可调用?

时间:2017-07-10 20:02:03

标签: ruby

有没有办法创建一个具有属性的对象,只能使用函数调用的符号来调用?等同于Python的__call__

例如:

obj = ExampleClass.new()
obj() # call notation

欢迎使用替代方法,我需要一种方法让可调用的“对象”存储自己的属性。

我要做的是将可调用的“对象”存储在变量中。此对象具有与之关联的属性,同时,它可以像方法一样使用。

2 个答案:

答案 0 :(得分:3)

如果您愿意稍微更改所需的语法......

class Foo
  def call
    puts 'called'
  end
end

f = Foo.new
f.()
# >> called

正如您的问题中的确切语法在ruby中是不可能的,因为括号是可选的,因此f()f相同。在可调用对象的情况下,这是不明确的。是要执行调用还是仅引用可调用对象?显式调用(使用点语法)消除了歧义。

答案 1 :(得分:2)

你不能让一个对象可以调用,只要我知道这是为方法调用保留的,但是你可以使用替代符号进行一些黑客攻击:

class ExampleClass
  def []
    :callable
  end
end

现在你可以做到:

example = ExampleClass.new
example[]

这与你如何调用Proc:

类似
proc = Proc.new { :return_value }
proc[]
# => :return_value

它并不完美,但它会起作用。

请注意,通常您可以通过围绕这些限制构建API来解决这些问题。