0

这有效:

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

4

1 回答 1

4
  • 可以使用可选块调用任何方法。
  • 块可以具有形式do |params| ... end或形式{ |params| ... }
    • 在 Ruby 社区中,将前者用于多行块,将后者用于单行块是惯用的。
  • 块不必接受参数,在这种情况下,它们实际上可以显示为do ... end{ ... }
  • 因此foo {}可以解释为将空哈希作为参数foo({})的方法,即,或者作为传递空块的方法,类似于foo{ |x| }or 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的每个值都映射到该值。

于 2013-02-21T19:17:27.047 回答