【问题标题】:initialize chef attribute with ruby block?用红宝石块初始化厨师属性?
【发布时间】:2015-04-11 04:48:37
【问题描述】:

这是我想保存 Time.now.strftime('%m%d%Y_%H%M') 输出的 ruby​​ 命令,我想我可以在我的食谱中添加这样的东西'

TODAY={ ::Time.now.strftime('%m%d%Y_%H%M') }

但这似乎不起作用

==> default: [2015-04-10T17:53:44+00:00] ERROR: /tmp/vagrant-chef/eb36617d9c55f20fcee6cd316a379482/cookbooks/test-cookbook/recipes/install_app.rb:12: syntax error, unexpected '}', expecting tASSOC
    ==> default: TODAY={ (Time.now.strftime('%m%d%Y_%H%M')) }
    ==> default:                                             ^
    ==> default: [2015-04-10T17:53:44+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

最后我想把它变成一个属性,这样我就可以从多个食谱中访问它

default['neustar-npac-deployment']['node_ohai_time'] = TODAY={ ::Time.now.strftime('%m%d%Y_%H%M') }

谢谢!

【问题讨论】:

  • 为什么你有{} 这不是一个块,而是实际上是哈希字面量语法。如果您希望这是一个惰性块,请使用->{}lambda {},它们都会产生lambdaProc.new {},它们将产生真正的Proc。所以像TODAY = -> {Time.now.strftime('%m%d%Y_%H%M')}。然后要获得结果,它将是 TODAY.call 或者您可以直接将其设置为 TODAY = Time.now.strftime('%m%d%Y_%H%M') 但似乎您希望它进行惰性评估,因此 lambda 可能最适合。
  • 我不介意它是否是懒惰的评估,我只是按照一个例子而不了解{ } 的用途。我会尝试直接使用它,看看它是否有效。谢谢
  • 我的观点是TODAY = Time.now.strftime('%m%d%Y_%H%M') 意味着TODAY 一旦被评估就不会改变,因为它是一个固定常数,而TODAY = -> { Time.now.strftime('%m%d%Y_%H%M') } 意味着每次你使用TODAY.call 时它都会评估lambda 和立即返回响应电流。这有意义吗?
  • 哦,我现在明白了,这很整洁!在这种情况下,我只需要它保持不变,但我会记住它以供将来参考。
  • 你应该发表你的评论作为答案:)

标签: ruby variables attributes chef-infra


【解决方案1】:

根据您的要求,我将其发布为答案。

现在您错误地使用了{},因为这不是块而是Hash 文字,这就是它抱怨的原因。为了使它成为一个块,您必须使用 lambdaProc 对象。

λ

可以使用 2 种不同的语法样式之一来创建 lambda

-> { "This is a lambda" } 
#=> #<Proc:0x2a954c0@(irb):1 (lambda)>
lambda { "This is also a lambda" }
#=> #<Proc:0x27337c8@(irb):2 (lambda)>

任何一种都可以接受

过程

可以使用Proc.new { "This is a proc" } 创建过程

对于这个问题,不需要语义差异。

lambdaProc 将懒惰地评估 #call 块内的语句,这意味着该值可以保持流动。

让我们举个例子:

 NOW = Time.now.strftime('%m%d%Y_%H%M')
 # in this case NOW will be evaluated once and will always equal the 
 # string result of when it was first interpretted
 TODAY = -> {Time.now.strftime('%m%d%Y_%H%M')}
 # in this case TODAY is simply a lambda and it's value will be dependent
 # upon the time when you "call" it so something like this will clearly illustrate
 # the difference
 while NOW == TODAY.call
    puts "Still the same time" 
 end 
 # after this NOW will still reflect it's initial set value and for 
 # a while ~ 1 minute this will output "Still the same time" 
 # at some point TODAY.call will increment up by 1 minute because it is 
 # re-evaluated on each `#call` thus allowing it to change periodically with the clock

我希望这能以某种方式帮助您更好地理解这个概念。

【讨论】:

  • 感谢对 proc 和 lambda 的精彩介绍!
猜你喜欢
  • 2018-08-11
  • 1970-01-01
  • 2013-02-03
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多