2010-12-31 4 views
0

したがって、class_evalの以下のメソッドは、実行時に定義された属性のアクセサーを動的に作成します。たとえば、設定ファイルから読み取った属性を持つ構成オブジェクトを作成するために使用できます(実行時までは不明です)。私はelseブランチを除いてすべてを理解しています。私が正しければ、* valに1つの値が渡された場合、elseブランチは属性値(val [0])を返します。しかし、* varに1つ以上の値が渡された場合、配列(val)を返すことが期待されます。 このrubyカスタムアクセサはどのように動作するのですか

value = 5 

は、コードを読んでから、私は @value to be [=,5]を期待する:特に、私は次のようなものを持っている場合。しかし @valueは配列5ではなく配列[=、5]を返します。これはどのように可能ですか?

class Module 
    def dsl_accessor(*symbols) 
     symbols.each do |sym| 
      class_eval %{ 
       def #{sym}(*val) 
        if val.empty? 
         @#{sym} 
        else 
         @#{sym} = val.size == 1 ? val[0] : val 
        end 
       end 
      } 
     end 
    end 
end 

答えて

3

等号はメソッドの引数ではなく、メソッド名の一部です。実際には、このように割り当てを呼び出すことができます。

value=(5) 

だから、唯一の整数5は再び@#{SYM} = valのではなく、私はそれを理解する機能

*更新

class Module 
    def dsl_accessor(*symbols) 
     symbols.each do |sym| 
      class_eval %{ 
       def #{sym} 
        @#{sym} 
       end 
       def #{sym}=(val) 
        @#{sym} = val 
       end 
      } 
     end 
    end 
end 
+0

の引数です。サイズ== 1? val [0]:val @valueはval(これは["="、5]を保持します)と等しく設定されますので、@value = ["="、5]と同じではありませんか? – ennuikiller

+0

なぜvalが保持されることを期待しますか?["="、5]?呼び出し中の場合 value = 5 には '='引数がありません 今のところモジュールにはゲッターメソッドしかありません。実際にカスタムアクセサを作成する場合は、2つのメソッドを作成する必要があります。私が – z3ple

+0

と答えるために加えるコードのようなもの、あるいは単純なものでもあります:def dsl_accessor(* symbols); class_eval%{:attr_accessor:#{symbols.join( '、:')}}; end – z3ple

関連する問題