6

长话短说,我正在编写一个包含选项参数的方法,如果键 :if 的值评估为 true,它将执行某些操作。当我使用新语法在 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

我的问题是:这是预期的行为、错误还是限制?

4

1 回答 1

6

用任何语言可靠且明确地解析事物是具有挑战性的。当您开始使用保留字时尤其如此。并且irb必须超越这一点,并在解析器之上提供一个交互式模型,这更加困难。我个人认为,无论是作为语言的用户还是作为维护者,担心这样的情况并没有太大的价值。在我看来,最好简单地弄清楚什么是有效的,并尽可能避免陷入这些情况。

你可以在普通的 Ruby 中看到一些类似的行为irb。例如:

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错误。

但是有可能或值得解决吗?@coreyward 在他的评论中提出了一个很好的观点,即irb在大多数情况下遇到if. 您必须进一步了解才能确定,但​​您可能无法明确解释所有这样的情况。

我的建议:如果可以的话,完全避免这种结构,如果可以避免的话,不要使用标签的保留字!

这是一个可以用纯 Ruby 运行的文件(例如 MRI)。您应该{:if=>true}在输出中看到以确认它有效。

{if: true}
foo = {if: true}
# if MRI is working, should be able to execute this file without trouble.
p foo
于 2013-02-19T20:55:28.073 回答