我有以下Ruby代码:
class Baz
def foo()
qux = Class.new() {
def call()
bar()
end
}.new()
qux.call()
end
def bar()
puts "bar"
end
end
b = Baz.new()
b.foo()
如何从匿名类访问方法bar
,即qux.call
?有可能吗?
我一直在收到这条消息:
classes-test.rb:5:in `call': undefined method `bar' for #<#<Class:0x00000002d9c248>:0x00000002d9c1a8> (NoMethodError)
我是Ruby的新手,所以对此问题的任何建议或更深入的解释都将受到赞赏。提前谢谢。
答案 0 :(得分:1)
由于.bar
是Baz
的实例方法,因此您需要在上下文中使用Baz
的实例来调用.bar
。您可以通过在初始化时将实例对象传递给类来实现,因此您可以在其上调用其.bar
方法。
这有效:
class Baz
def foo
qux = Class.new do
def initialize(a)
@a = a
end
def call
@a.bar
end
end.new(self)
qux.call
end
def bar
puts "bar"
end
end
b = Baz.new
b.foo
=> 'bar'
如果你需要在评论中提及class
到Class.new()
,你可以像这样覆盖初始化方法(请注意你可能必须考虑你的Closure类的参数初始化super
的需求:
qux = Class.new(Fiddle::Closure) do
def initialize(baz)
@baz = baz
super
end
def call
@baz.bar
end
end.new(self)
在旁注中,如果不需要,您不需要所有()
个Ruby style {/ 3}}。