2013-08-20 23 views
0

我不是Ruby开发者,并且正在修改Chef食谱。我很好奇,如果可以将以下内容放在一行中。将回调放在同一行

directory "/var/lib/mysql" do 
    action :delete 
end 

我尝试这样做:

directory "/var/lib/mysql", :action => "delete" 

然而,抛出此错误:

ArgumentError 
------------- 
wrong number of arguments (3 for 2) 

我已经看到了这个为好,但这似乎只是尴尬的对我说:

directory "/var/lib/mysql" do action => "delete" end 

回答

1

大括号相当于do...end,并且更通常用于单行:

directory("/var/lib/mysql") { action :delete } 

添加括号需要避免歧义,因为括号也用于定义散列。

+0

现在如果调用有两个参数会怎么样。 '目录“/ var/lib/mysql/data”do owner“mysql”group“mysql”end'。把它转换成'directory(“/ var/lib/mysql/data”){owner“mysql”group“mysql”}'会导致编译错误。 –

+1

你引用的“参数”实际上是方法调用 - 它们是Ruby代码的行。你使用参数'“mysql”'调用方法'owner',然后使用参数'“mysql”'调用'group'方法。你需要通过在分隔符之间加上分号来表明这些是单独的行(而不仅仅是'owner'方法的一长串参数):'{owner“mysql”;组“mysql”}'。 – Grantovich

1

你可以做两种方式,如使用一种叫说block

directory("/var/lib/mysql") { action :delete } 

,你可以把你的代码这种方式,是想告诉您的分号在红宝石存在;))

directory "/var/lib/mysql" do ; action :delete ; end