[英]IRB - Ruby 1.9.x hash syntax: {if: true} is not equal to {:if => true}
简而言之,我正在编写一个包含选项参数的方法,如果键的值为:if,则会执行某些操作。 当我使用新语法在IRB中尝试哈希时,我在IRB中遇到语法错误,提示保持打开状态:
1.9.3p374 :010 > {if: true}
1.9.3p374 :011?>
使用旧的语法,工作得很好:
1.9.3p374 :011 > {:if => true}
=> {:if=>true}
所有启动语句的关键字都表现出相同的行为。 例如def
, do
, module
, case
在中间和class
中发生的其他保留字工作正常: else
, end
我的问题是:这是预期的行为,错误还是限制?
用可靠和明确的方式解析任何语言的东西都是一项挑战。 当您开始使用保留字时尤其如此。 并且irb
必须超越它并在解析器之上提供交互式模型,这更加困难。 我个人并不认为担心这样的案件有太大的价值,无论是作为语言的用户还是作为维护者。 在我看来,最好简单地弄清楚什么有效,并尽可能避免陷入这些情况。
您可以在irb
之外的纯Ruby中看到一些类似的行为。 例如:
puts({if: true}) # no problem, behaves as expected in Ruby 1.9.3.
puts {if: true} # raises a syntax error in Ruby 1.9.3
要回答你的问题,它是“预期的行为,错误还是限制”,我会说你应该忽略irb
并将它与普通Ruby进行比较,如果你这样做,它就可以了。 这意味着它必须是一个irb
bug。
但是有可能或值得解决吗? @coreyward在他的评论中提出了一个很好的观点,即在遇到if
时, irb
必须在大多数情况下延迟执行。 你必须要进一步了解,但你可能无法明确地解释所有这样的情况。
我的建议:如果可以的话,完全避免这种结构,如果可以避免,不要使用保留字作为标签!
这是一个可以用普通Ruby(例如MRI)运行的文件。 您应该在输出中看到{:if=>true}
以确认它是否有效。
{if: true}
foo = {if: true}
# if MRI is working, should be able to execute this file without trouble.
p foo
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.