2013-08-20 22 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