したがって、以下の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