2013-02-21 10 views
0

哈希文字此工程:爲什麼有時紅寶石失誤與塊

[1, 2].inject({}) do |result, item| end 

這也適用於:

[1, 2].inject Hash.new do |result, item| end 

這將引發一個語法錯誤:

[1, 2].inject {} do |result, item| end 

在哪些情況下哈希文字{}Hash.new不可互換?

+0

爲何選擇投票? – Ethan 2013-02-21 19:26:49

+2

關於我們是否應該使用圓括號來爲方法分隔參數,有兩個陣營。這是不使用它們遇到麻煩的時候。我不喜歡這樣的錯誤,而且,因爲我在職業生涯中已經實現了許多其他語言,所以幾乎在每個方法調用中都使用括號。 '[1,2] .inject({})do | result,item |結束'是我該怎麼做的。 – 2013-02-21 19:32:00

+0

Ruby不會犯錯,你犯錯誤。 – sawa 2013-02-21 19:37:28

回答

4
  • 任何方法都可以用一個可選塊調用。
  • A嵌段可以具有以下形式do |params| ... end或形式{ |params| ... }
    • 它是Ruby社區內慣用使用前者用於多塊,而後者爲單行塊。
  • 塊不必接受參數,在這種情況下,他們實際上可以表現爲兩種do ... end{ ... }
  • 因此foo {}可被解釋爲任一取一個空散列作爲參數,即foo({})或正在傳遞的空塊,類似於foo{ |x| }foo{ nil }的方法的方法。 Ruby選擇將其解釋爲前者,這將您的示例作爲一個方法,其中包含兩個塊,這在語法上不是有效的。

既然你似乎沒有意識到的更簡潔的塊語法,你可以使用它像這樣:

squares = [1,2,3,4,5].map{ |x| x*x } #=> [1,4,9,16,25] 

而這裏的法律空白塊語法的(不是非常有用的)例子:

p [1,2,3].map{} #=> [nil,nil,nil] 

該塊沒有語句等在該塊中的最後一個表達式的值是nil,向其中塊中的每個值被映射。

+0

如果一個方法需要兩個塊,不應該是兩個塊之間的逗號',',就像'foo {},{}'?看起來像一個紅寶石解釋器錯誤給我。 – Ethan 2013-02-21 19:30:46

+2

@Ehan:'f {},{}'是一個用兩個空的Hashes作爲參數調用的方法。這裏有一些不明確的地方,Ruby必須解決這個模棱兩可的問題,它以一種你不喜歡的方式解決了模糊問題並不是一個錯誤,它只是它的方式。 – 2013-02-21 19:58:28