Ruby - 从匿名访问实例方法/变量 class
Ruby - accessing instance methods / variables from anonymous class
我有以下 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()
如何从匿名 class(即从 qux.call
访问方法 bar
?可能吗?
我一直收到这条消息:
classes-test.rb:5:in `call': undefined method `bar' for #<#<Class:0x00000002d9c248>:0x00000002d9c1a8> (NoMethodError)
我是 Ruby 的新手,所以任何建议或对问题的更深入解释将不胜感激。提前致谢。
由于 .bar
是 Baz
的实例方法,您需要在上下文中提供 Baz
的实例才能调用 .bar
。您可以通过在初始化时将实例对象传递给 class 来做到这一点,这样您就可以调用它的 .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()
,您可以像这样覆盖初始化方法(请注意,您可能必须考虑您的参数关闭 class 初始化 super
的需求:
qux = Class.new(Fiddle::Closure) do
def initialize(baz)
@baz = baz
super
end
def call
@baz.bar
end
end.new(self)
附带说明一下,您不需要所有这些 ()
,如果不需要,Ruby style 可以省略它们。
我有以下 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()
如何从匿名 class(即从 qux.call
访问方法 bar
?可能吗?
我一直收到这条消息:
classes-test.rb:5:in `call': undefined method `bar' for #<#<Class:0x00000002d9c248>:0x00000002d9c1a8> (NoMethodError)
我是 Ruby 的新手,所以任何建议或对问题的更深入解释将不胜感激。提前致谢。
由于 .bar
是 Baz
的实例方法,您需要在上下文中提供 Baz
的实例才能调用 .bar
。您可以通过在初始化时将实例对象传递给 class 来做到这一点,这样您就可以调用它的 .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()
,您可以像这样覆盖初始化方法(请注意,您可能必须考虑您的参数关闭 class 初始化 super
的需求:
qux = Class.new(Fiddle::Closure) do
def initialize(baz)
@baz = baz
super
end
def call
@baz.bar
end
end.new(self)
附带说明一下,您不需要所有这些 ()
,如果不需要,Ruby style 可以省略它们。