2011-10-21 5 views
1

ルビーのモジュールレベルの変数を参照するのに何か問題があります。モジュール内のモジュールレベルの変数を参照しています

module M 
    @@a=1 

    def self.a 
    @@a 
    end 

    class A 
    def x 
     M.a 
    end 
    end 
end 

さて、この例では、私のために正常に動作しますが、それはモジュールが広がっている少し複雑コンテキスト(に失敗している:私は、内部で馬に言及しています。このような状況を、持っていると言いますコードの実行方法には影響しないはずです):M :: M(NoMethodError)の未定義メソッド `a '。

これはコンテキスト内のモジュールレベルの変数を参照する正しい方法ですか?よりシンプルな/慣用的な方法がありますか?

答えて

3

モジュールが他のファイルにまたがっている場合は、メソッドが呼び出される前に初期化が実行されていることを確認する必要があります。それらが同じファイルにある場合、これは保証されているはずですが、どういうわけかそれらを分割すると問題が発生する可能性があります。

私は通常これで逃げることができます発見しました:

module M 
    def self.a 
    @a ||= 1 
    end 
end 

この変数は変更される場合があります場合は、ミューテータメソッドが必要になります。 Railsは基本的にActiveSupportの一部である、mattr_accessorを提供します。

関連する問題