Ruby代码块和Chef

我是 Ruby和Chef的新手.我一直试图绕过语法并做一些研究,但我相信大家都知道,除非你知道术语,否则很难找到你想要的东西.

我已经阅读了Ruby代码块,但是Chef代码块仍然让我困惑.我看到这样的事情:

log "a debug string" do
    level :debug
end

这会在日志中添加“调试字符串”.从我所看到的情况来看,在我看来它应该表示为:

log do |message|
    #some logic
end

Chef将这些视为资源.有人可以帮助解释语法差异并给我一些术语,我可以从中开始教育自己吗?

解决方法

如果你来自另一种语言(不是Ruby),这种语法可能看起来很奇怪.让我们分解一下.

调用带参数的方法时,在大多数情况下括号是可选的:

> foo(bar)相当于foo bar
> foo(bar,baz)相当于foo bar,baz

Ruby代码块可以用大括号({})或do..end块包装,可以作为最后一个参数传递给方法(但请注意,没有逗号,如果你使用括号,它会去在他们之后.一些例子:

foo(bar) { # code here }

foo(bar) do
  # code here
end

foo bar do
  # code here
end

foo do
  # code here
end

在某些情况下,代码块可以接收参数,但在Chef中,资源的块永远不会.仅供参考,其语法为:

foo(bar) do |baz,qux|
  baz + qux
end

特别是关于Chef资源,它们的语法通常是:

resource_type(name) do
  attribute1 value1
  attribute2 value2
end

这意味着,当你说:

log "a debug string" do
  level :debug
end

您实际上是在创建一个日志资源,其name属性设置为“调试字符串”.稍后可以使用log [调试字符串]来引用它(例如,在其他资源中).

AFAIK,name属性对于每个Chef资源类型都是必需的,因为它使它独特,并允许您在声明之后调用其上的操作.

附注:对于Chef资源,ruby块通常是可选的.如果您执行以下操作:

directory "/some/path"

Chef将使用其属性(其中包括action:create)编译该资源,并尝试使用这些属性创建命名目录.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...