Ruby - 从匿名类访问实例方法/变量

时间:2015-03-03 23:11:01

标签: ruby closures 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()

如何从匿名类访问方法bar,即qux.call?有可能吗?

我一直在收到这条消息:

classes-test.rb:5:in `call': undefined method `bar' for #<#<Class:0x00000002d9c248>:0x00000002d9c1a8> (NoMethodError)

我是Ruby的新手,所以对此问题的任何建议或更深入的解释都将受到赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:1)

由于.barBaz的实例方法,因此您需要在上下文中使用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'

如果你需要在评论中提及classClass.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}}。