2011-02-04 13 views
2

私はStruct.newを使用して、新しいクラスを作成しています(私たちはいくつかのエンティティモデリングミドルウェアを使用しています。Struct.newブロックのクラス変数へのアクセス

module A 
    def self.init_on(target) 
     target.foo = 123 
    end 
end 

$base_module = A 


module Test 
    C = Struct.new(:id) do 
     include $base_module 

     @@base = $base_module 

     def initialize 
      @@base.init_on(self) 
     end 

     attr_accessor :foo 
    end 
end 

c = Test::C.new 
puts c.foo 

私は私のテストを実行したときに、私はこのエラーを取得する:本質的には

私はこのコードを持っている

test2.rb:17:initialize': uninitialized class variable @@base in Test::C (NameError) from test2.rb:24:inで新しい」test2.rbから :24: in '

私はStruct.newを理解しているので、ブロックは作成されるクラスのコンテキストで実行されるため、@@ baseは解決可能でなければなりません。

ありがとうございました!

編集: 私はinit_on self.init_onを作成し、instance_variable_setではなくclass_variable_setを使用しました。それは今働きます!

答えて

-1

self.instance_variable_set(:@@base, $base_module)のようなものを使用しないようにしましょう。私はあなたがクラスオブジェクトのインスタンス変数を設定しているだけなので、うまくいくと思います。

+1

これは、 '@@ base'が明らかにインスタンス変数ではないという単純な理由のために、おそらく動作しません。 –

+0

あなたが答えを提供していないと考えて、私を投票することは少しラフです.... – TheDelChop