2016-08-28 12 views
1

クラスメソッドtestを動的に作成したいと考えています。そのためには、メソッドをinstance_evalに使用しています。私はコードの下にクラスメソッドtestを作成することを期待していましたが、代わりにコードはインスタンスメソッドtestを作成しています。何がこの理由だろうか?以下は私のコードです。Ruby:クラスメソッドの代わりにインスタンスメソッドを作成するクラスのインスタンスeval

module Accessor 
    def define_accessor_for_class(method) 
    self.instance_eval do 
     define_method :test do 
     end 
    end 
    end 
end 




class Employee 
    extend Accessor 
    define_accessor_for_class :name 
end 


Employee.name = "sanjay" 
Employee.name 

Employee.instance_methods(false) ==> [:test] 
Employee.methods(false) => [] 

答えて

1

あなたはdefine_singleton_methodの代わりdefine_methodを使用したいと思うでしょう。

module Accessor 
    def define_accessor_for_class(method) 
    self.instance_eval do 
     define_singleton_method :test do 
     end 
    end 
    end 
end 

シングルトン方法は、(クラスのすべてのインスタンスに利用可能である正規インスタンスメソッドとは異なり)、シングルトンクラスに住んでいて、単一のオブジェクトに対してのみ利用可能である方法です。あなたのクラスでは、クラスメソッドのように動作します。

ここ

Employee.instance_methods(false) #=> [] 
Employee.methods(false)   #=> [:test] 
2

instance_evalself変化する結果、すなわち動的インスタンス変数のコンテキストとreceiverlessメッセージ送信です。 、つまり非修飾メソッド定義の動的コンテキストは変更されません。 、何らかの理由で、

module Accessor 
    def define_accessor_for_class(method) 
    def self.test; end 
    end 
end 

class Employee 
    extend Accessor 
    define_accessor_for_class :name 
end 

Employee.instance_methods(false) #=> [] 
Employee.methods(false)   #=> [:test] 

の場合:あなたのメソッドの定義については何が動的ではありませんので、あなたの場合は

は、あなただけの修飾されたメソッドの定義を使用することができ、全くの動的メタプログラミングを使用する理由はありませんにはのダイナミズムが必要ですが、代わりにObject#define_singleton_methodを使用できます。

関連する問題