class_evalブロック内でクラス変数を定義するにはどうすればよいですか?私は、次のしている:User.methods
またはPost.methods
を使用して検査中にモジュール#内の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
クラスのユーザーとポストの両方が:get
を示しました。これは、class_evalのコンテキストで定義されているように意味があり、まさに私が必要とするものです。同様に、メソッド:find
は個々のクラスのinstance_methodとして示されています。
しかし、私がクラス変数、すなわち@@collection
と考えていたのは、モジュールレベルのclass_variableであることが判明しました。 User.class_variables
またはPost.class_variables
を調べると、空になります。しかしPersist.class_variables
は:@@collection
です。
これはどのように可能ですか? class_eval
内のコンテキストがそのクラスのコンテキストではないのですか?したがって、変数@@collection
はモジュールではなくクラスで定義されるべきですか?
また、@@collection
の値は、常にそれを含む最後のクラスの名前です。したがって、この場合は常に「投稿」で、ユーザーは決してありません。これはモジュールレベルの変数なので、すべてのインクルードで変更されると思います。これは正しいです?
最後に、各クラスに独自の@@collection
定義があるように、このコンテキストでクラス変数をどのように定義しますか。
ありがとうございます!非常に明確な説明。私はclass_variable_setを使用して終了しました。 –
ClassMethodsを使用すると、モジュール関連の静的変数も作成されます。 – Geoffroy
この回答は修正する必要があります。 ClassMethodsモジュールを使用して最初に提示されたメソッドは、問題の問題を解決するためには機能しません。そこで宣言されたクラス変数もモジュールにスコープされ、すべてのクラスをまたいで共有されます。 'class_variable_set'メソッドは動作しますが、この回答の唯一の情報でなければなりません –