这有效:
[1, 2].inject({}) do |result, item| end
这也有效:
[1, 2].inject Hash.new do |result, item| end
抛出一个SyntaxError:
[1, 2].inject {} do |result, item| end
在哪些情况下,散列文字{}
和Hash.new
不可互换?
答案 0 :(得分:4)
do |params| ... end
,也可以是{ |params| ... }
格式
do ... end
或{ ... }
。foo {}
可以解释为将空Hash作为参数的方法,即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
,块中的每个值都映射到该值。