class_evalブロック内でクラス変数をどのように定義しますか?私は次のものを持っています:
module Persist
def self.included(base)
# base is the class including this module
base.class_eval do
# class context begin
@@collection = Connection.new.db('nameofdb').collection(self.to_s.downcase)
def self.get id # Class method
#...
end
end
end
# Instance methods follow
def find
@@collection.find().first
#...
end
end
class User
include Persist
end
class Post
include Persist
end
UserとPostの両方のクラスは、または:get
を使用して内省するときに表示されます。class_evalのコンテキストで定義されており、まさに私が必要としているものであるため、これは理にかなっています。同様に、メソッドは個々のクラスのinstance_methodとして表示されます。User.methods
Post.methods
:find
しかし、私が思ったのはクラス変数、つまり@@collection
、モジュールレベルのclass_variableであることがわかりました。私が内省するか、User.class_variables
またはPost.class_variables
、それらは空になります。ただしPersist.class_variables
、を示しています:@@collection
。
これはどのように可能ですか?class_eval
ブロック内のコンテキストはクラスのコンテキストではありません。では、変数@@collection
はモジュールではなくクラスで定義されるべきではありませんか?
また、の値@@collection
は常に、それを含む最後のクラスの名前です。したがって、この場合、それは常に「投稿」であり、「ユーザー」ではありません。これはモジュールレベルの変数であるためだと思います。インクルードごとに変更されます。これは正しいです?
最後に、各クラスが独自の定義を持つように、このコンテキストでクラス変数をどのように定義しますか@@collection
。