【发布时间】:2012-06-29 22:01:18
【问题描述】:
我有一个看起来像这样的小 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
Log 的构造函数在最后一行产生self:
def initialize(activity, &block)
@activity = activity
yield self
end
在我看来,这就是问题所在。我已经尝试在#eat 方法中使用instance_eval(请参阅下面的链接#2)并从Log 的构造函数中完全删除yield 语句(链接#3),但是这些方法都不起作用(Log 对象已创建,但未设置其 #duration 和 #priority 方法)。
以下是链接:
1) A working DSL with block parameters
2) Non-working DSL, first refactoring attempt
3)Non-working DSL, second refactoring attempt
谢谢!
【问题讨论】:
标签: ruby codeblocks dsl yield