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
の引数です。サイズ== 1? val [0]:val @valueはval(これは["="、5]を保持します)と等しく設定されますので、@value = ["="、5]と同じではありませんか? – ennuikiller
なぜvalが保持されることを期待しますか?["="、5]?呼び出し中の場合 value = 5 には '='引数がありません 今のところモジュールにはゲッターメソッドしかありません。実際にカスタムアクセサを作成する場合は、2つのメソッドを作成する必要があります。私が – z3ple
と答えるために加えるコードのようなもの、あるいは単純なものでもあります:def dsl_accessor(* symbols); class_eval%{:attr_accessor:#{symbols.join( '、:')}}; end – z3ple