有没有办法创建一个具有属性的对象,只能使用函数调用的符号来调用?等同于Python的__call__
。
例如:
obj = ExampleClass.new()
obj() # call notation
欢迎使用替代方法,我需要一种方法让可调用的“对象”存储自己的属性。
我要做的是将可调用的“对象”存储在变量中。此对象具有与之关联的属性,同时,它可以像方法一样使用。
答案 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来解决这些问题。