如何在 OpsCode Chef 中调用 lamda 以仅进行运行时评估?

how to .call a lamda in OpsCode Chef to be able to do a run time evaluation only?

提问人:Ronald Top 提问时间:11/17/2023 最后编辑:Holger JustRonald Top 更新时间:11/17/2023 访问量:65

问:

我有一个关于 Chef 和 Lambda 方法的问题,该方法用于在运行时而不是在编译时评估变量。检查下面的截图:

md5 = lambda { Digest::MD5.file("#{some_file}").hexdigest }
pp "md5: #{md5}"

这导致:

md5: #<Proc:0x000000000c153b08

但我确实希望拥有变量本身。.调用 lambda 并获取实际变量的确切语法是什么?我拔了好几天的头发。

任何帮助,非常感谢!

Ruby 变量 lambda chef-infra

评论

1赞 Holger Just 11/17/2023
请注意,这可能是多余的。如果已经是一个字符串,则可以按原样使用它。"#{some_file}"some_file

答:

3赞 Stefan 11/17/2023 #1

调用 proc 或 lambda 的几个选项:

md5 = lambda { "foo" }

"md5: #{md5.call}"  #=> "md5: foo"
"md5: #{md5.()}"    #=> "md5: foo"
"md5: #{md5[]}"     #=> "md5: foo"
"md5: #{md5.yield}" #=> "md5: foo"

以上每个也可以接受参数。例如,这可用于传递文件名:( 是一个 lambda proc 文本->)

md5 = ->(filename) { Digest::MD5.file(filename).hexdigest }

"md5: #{md5.call(somefile)}"
"md5: #{md5.(somefile)}"
"md5: #{md5[somefile]}"
"md5: #{md5.yield(somefile)}"

评论

1赞 Alex 11/18/2023
也像那样md5 === somefile
1赞 Holger Just 11/17/2023 #2

要评估 lambda 代码,您可以:call

md5 = lambda { Digest::MD5.file("#{some_file}").hexdigest }
pp "md5: #{md5.call}"

lambda 的方法,或者通常,Ruby 中的 Proc 对象将评估创建 Proc 时给出的块并返回块的返回值。请注意,结果不会被缓存,每次调用都会再次评估该块。callcall

评论

0赞 Ronald Top 11/22/2023
谢谢!但是,另一个答案更完整,因此值得称赞,但两者都非常有帮助,谢谢!