0

我有一个看起来像这样的小 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

在我看来,这就是问题所在。我已经尝试过instance_eval#eat方法中使用(参见下面的链接#2)和yield完全从日志的构造函数中删除语句(链接#3),但是这些方法都不起作用(创建了日志对象,但没有得到它#duration#priority方法集)。

以下是链接:

1)具有块参数的工作 DSL

2)非工作DSL,第一次重构尝试

3)非工作DSL,第二次重构尝试

谢谢!

4

1 回答 1

4

duration = 15没有像您期望的那样调用 setter 方法,而是定义了一个局部变量duration。您必须通过显式调用 setterself.duration = 15或实现您的 setter

def duration(value)
  @duration = value
end

并打电话duration 15

于 2012-06-28T12:09:32.753 回答