2

そのため、ルビーでミックスインといくつかのメタプログラミングを試していますが、これを機能させることができません。「ヒヒ」を印刷したい

 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
4

1 に答える 1

4

B独自の自己完結型クラスです。Bクラスのインスタンスが の内部でたまたま作成されるということを除いて、他のクラスまたはモジュールのいずれとも関連付けられたり接続されたりしませんInstanceMethods::testclass Bfor の定義内で宣言するとmodule InstanceMethods、 の範囲が制限され、Bの外では見えなくInstanceMethodsなりますが、接続BInstanceMethodsれません。

必要なのは、モジュールの変数を の中で見えるようにすることですB。パラメーターを受け取るinitializeメソッドを実装し、値をに渡すために使用できます(値をインスタンス変数として格納するようにしてください)。BInstanceMethods::testb = B.new(@monkey)BB::initialize

于 2012-05-26T00:15:49.057 に答える