2

私は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:in initialize': uninitialized class variable @@base in Test::C (NameError) from test2.rb:24:innew'from test2.rb:24:in `'

Struct.newの私の理解から、ブロックは作成されているクラスのコンテキストで実行されるため、@@baseは解決可能である必要があります。

御時間ありがとうございます!

編集:ありがとう-私はinit_on self.init_onを作成し、instance_variable_setではなくclass_variable_setを使用しました。今は動作します!

4

1 に答える 1

-1

のようなものを使ってみませんかself.instance_variable_set(:@@base, $base_module)。クラスオブジェクトのインスタンス変数を設定しているだけなので、うまくいくと思います。

于 2011-02-04T20:22:34.880 に答える