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 的新手,所以任何建议或对问题的更深入解释将不胜感激。提前致谢。

由于 .barBaz 的实例方法,您需要在上下文中提供 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 可以省略它们。