为什么Ruby有时会错误地使用块来散列文字

时间:2013-02-21 19:12:57

标签: ruby syntax

这有效:

[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不可互换?

1 个答案:

答案 0 :(得分:4)

  • 可以使用可选块调用任何方法。
  • 某个块的格式可以是do |params| ... end,也可以是{ |params| ... }格式
    • 在Ruby社区中,使用前者用于多行块,后者用于单行块,这是惯用的。
  • 块不必接受参数,在这种情况下,它们实际上可以显示为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,块中的每个值都映射到该值。