質問

したがって、Class_Evalの以下の方法は、実行時に定義された属性のアクセサーズを動的に作成します。たとえば、構成ファイルから読み取られた属性を持つ構成オブジェクトを作成するために使用できます(および実行時まで不明)。私は他のブランチを除くすべてを理解しています。私が正しい場合、elseブランチは *valに1つの値が渡された場合、属性値(val [0])を返します。ただし、その書かれた方法では、 *var。特に、以下のようなものがある場合:

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
役に立ちましたか?

解決

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

value=(5)

したがって、整数5のみが関数の引数です

*アップデート

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top