0

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

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
4

1 に答える 1

3

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

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
于 2010-12-31T03:01:24.563 に答える