哈希文字此工程:爲什麼有時紅寶石失誤與塊
[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
不可互換?
哈希文字此工程:爲什麼有時紅寶石失誤與塊
[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
不可互換?
do |params| ... end
或形式{ |params| ... }
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
,向其中塊中的每個值被映射。
如果一個方法需要兩個塊,不應該是兩個塊之間的逗號',',就像'foo {},{}'?看起來像一個紅寶石解釋器錯誤給我。 – Ethan 2013-02-21 19:30:46
@Ehan:'f {},{}'是一個用兩個空的Hashes作爲參數調用的方法。這裏有一些不明確的地方,Ruby必須解決這個模棱兩可的問題,它以一種你不喜歡的方式解決了模糊問題並不是一個錯誤,它只是它的方式。 – 2013-02-21 19:58:28
爲何選擇投票? – Ethan 2013-02-21 19:26:49
關於我們是否應該使用圓括號來爲方法分隔參數,有兩個陣營。這是不使用它們遇到麻煩的時候。我不喜歡這樣的錯誤,而且,因爲我在職業生涯中已經實現了許多其他語言,所以幾乎在每個方法調用中都使用括號。 '[1,2] .inject({})do | result,item |結束'是我該怎麼做的。 – 2013-02-21 19:32:00
Ruby不會犯錯,你犯錯誤。 – sawa 2013-02-21 19:37:28