4

有人可以向我解释为什么在 ruby​​ 控制台(版本 2.3.4)中尝试打印这些工作的哈希值:

puts({a: 'a', b: 'b'})
puts(a: 'a', b: 'b')
puts a: 'a', b: 'b'
puts [a: 'a', b: 'b']  <<< array length 1 with value of hash
puts Hash[a: 'a', b: 'b']

但这些都不起作用:

puts {a: 'a', b: 'b'}
puts {:a => 'a', :b => 'b'}
puts{:a => 'a', :b => 'b'}

给出错误:

语法错误,意外的 ',',需要 '}'

放 {a: 'a', b: 'b'}

_ _ _ _ _ _^

还有这些:

 puts {:a => 'a'}
 puts {a: 'a'}
 puts{a: 'a'}

也有错误:

语法错误,意外 =>,期待 '}'

放 {:a => 'a'}

_ _ _ _ _ ^

我对函数的理解 () 完全是可选的,并且取决于开发人员的风格偏好。

散列周围的 {} 大多是可选的,但从未要求不使用。

我可以理解解释器是否在 1 个或 2 个哈希之间混淆(因为 puts 需要 1+ 个参数),但它只是死了。

更糟糕的是:这些工作:

 puts({a: 'a', b: 'b'}, [:d, :e])
 puts ({a: 'a', b: 'b'})

但这些没有:

 puts ({a: 'a', b: 'b'}, [:d, :e])
 puts (Hash[a: 'a', b: 'b'], [:d, :e])

谁能解释幕后实际发生的事情?

4

1 回答 1

6

Ruby 有一个小故障,因为它对括号过于宽容。你几乎可以把它们从任何东西上去掉,但是......

puts{}解析为“puts使用块调用{}”。反过来,块必须​​包含完整的语句,而不是逗号,分隔的列表。所以你得到错误的语法错误。

修复只是puts({})

接下来,puts ()解析为 "puts后跟一个参数,在括号中。" 因此,同样,解析器无法处理,括号内的逗号。解决方法是占用空间:puts()

于 2018-05-10T19:10:38.150 回答