私は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を使用しました。それは今働きます!
これは、 '@@ base'が明らかにインスタンス変数ではないという単純な理由のために、おそらく動作しません。 –
あなたが答えを提供していないと考えて、私を投票することは少しラフです.... – TheDelChop