【问题标题】:Ruby syntax error when try to puts literal hash尝试放置文字哈希时的Ruby语法错误
【发布时间】:2018-10-21 03:18:48
【问题描述】:

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

谁能解释一下幕后到底发生了什么?

【问题讨论】:

    标签: ruby syntax-error literals puts ruby-2.3


    【解决方案1】:

    Ruby 有一个小故障,因为它对括号过于宽容。您几乎可以不使用它们,但是...

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

    修复只是puts({})

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

    【讨论】:

    • 这个 ^ 或将散列分配给一个变量,然后将其记录为 puts varname 使得损坏的也可以工作。
    • 所以我想从中得出的结论是哈希文字可能会与 ruby​​ 块混淆?
    • 是的;并且 Ruby 对空间有点敏感。 puts()puts () 不同。
    • IMO 从中得出的结论是,使括号在上下文中是可选的首先只是一个坏主意。对 Ruby 没有仇恨;这是一门很棒的语言;我从来没有被这个特殊的选择出售过。 :P
    最近更新 更多