从内部类访问外部类访问器

时间:2012-05-25 22:49:08

标签: ruby metaprogramming

所以我在ruby中尝试mixins和一些元编程,并且无法让这个对我起作用。我想要它打印“狒狒”

 module A

  def self.included(base)
      base.extend ClassMethods
  end

  module ClassMethods
    def install_A
        include InstanceMethods
    end
  end

  module InstanceMethods
      class B
         def testB
           #What goes here???
           A.monkey
         end
      end

      attr_accessor :monkey

      def initialize()
         @monkey = "baboon"
      end

      def test
          b = B.new
          puts b.testB
      end
  end
end

class Chimp
  include A
  install_A
end

c = Chimp.new
c.test

1 个答案:

答案 0 :(得分:4)

B是它自己独立的类。它没有与任何其他类或模块关联或连接,除非说B的实例恰好在InstanceMethods::test内创建。在class B的定义中声明module InstanceMethods会限制B的范围,使其在InstanceMethods之外不可见,但它不会连接BInstanceMethods以任何方式。

您需要的是在B内显示模块的变量。您可以为initialize实现一个带有参数的B方法,InstanceMethods::test可以使用b = B.new(@monkey)将值传递给B(确保{{1}将值存储为实例变量。)