Ruby 尝试放置文字哈希时出现语法错误

Ruby syntax error when try to puts literal hash

有人可以向我解释为什么在 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']

但是 none 这些工作:

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

给出错误:

syntax error, unexpected ',', expecting '}'

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

_ _ _ _ _ _^

还有这些:

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

也有错误:

syntax error, unexpected =>, expecting '}'

puts {: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])

谁能解释一下幕后的实际情况?

Ruby 有一个小故障,因为它对圆括号过于宽容。您几乎可以将它们放在任何地方,但是...

puts{} 解析为 "call puts with a block {}." 块,反过来,必须包含完整的语句,而不是逗号 , 分隔列表。所以你得到了错误的语法错误。

修复只是 puts({})

接下来,puts () 解析为“puts 后跟一个参数,在括号中。”因此,解析器无法处理括号内的逗号 ,。修复方法是删除 space:puts()