【发布时间】:2012-05-21 10:38:19
【问题描述】:
假设我们有两个资源:
template 'template1' do
owner 'root'
group 'root'
end
template 'template2' do
owner 'root'
group 'root'
end
我想在资源中重用代码。但是,如果我在配方中定义了一个 proc,你会得到 owner、group 等的 NoMethodError。为什么会发生这种情况?词法范围没有什么不同,是吗?结果我必须使用self.instance_eval &common_cfg。
common_cfg = Proc.new {
owner 'root'
group 'root'
}
template 'template1' do
common_cfg.call
end
template 'template2' do
common_cfg.call
end
【问题讨论】:
-
设为全局(
$common_cfg)是否会出现错误? -
proc 变量的评估结果很好,因为 NoMethodError 发生在 proc 的上下文中(所有者、组等)
-
哦; gotcha--将删除评论。
-
您的 proc 会记住在定义 proc 时 self 的值,即顶级对象。似乎厨师使用 instance_eval 执行块,因此块内的 self 与您的 proc 中的 self 不同
-
这可能正是正在发生的事情。如果没有其他人可以分享,我会将此作为答案。我还在思考为什么 instance_eval 在 Ruby 中很重要:rubylearning.com/blog/2010/11/30/…
标签: ruby closures code-reuse chef-infra lexical-scope