次のような小さな DSL があります。
ActivityLogger.log do
activity('27-06-2012') do
eat do |act|
act.duration = 15
act.priority = 5
end
end
end
最も内側のブロックのブロック パラメータを失うようにリファクタリングしたいので、次のようになります。
ActivityLogger.log do
activity('27-06-2012') do
eat do
duration = 15
priority = 5
end
end
end
この#eat
メソッドは、Log オブジェクトをインスタンス化します。
def eat(&block)
@logs << Log.new(Eat, &block)
end
ログのコンストラクターself
は最後の行で生成されます。
def initialize(activity, &block)
@activity = activity
yield self
end
私の考えでは、そこが問題です。instance_eval
メソッドでの使用#eat
(以下のリンク#2を参照)とログのコンストラクターからのステートメントの完全な削除(リンク#3)の両方を試しましyield
たが、これらのアプローチはどれも機能しません(ログオブジェクトは作成されますが、取得されません#duration
および#priority
メソッド セット)。
リンクは次のとおりです。
ありがとう!