【问题标题】:IRB - Ruby 1.9.x hash syntax: {if: true} is not equal to {:if => true}IRB - Ruby 1.9.x 哈希语法:{if: true} 不等于 {:if => true}
【发布时间】:2013-02-19 20:24:44
【问题描述】:

长话短说,我正在编写一个包含选项参数的方法,如果键 :if 的值评估为 true,它将执行某些操作。当我使用新语法在 IRB 中尝试哈希时,在 IRB 中出现语法错误,提示保持打开状态:

1.9.3p374 :010 > {if: true}
1.9.3p374 :011?>

使用旧语法,效果很好:

1.9.3p374 :011 > {:if => true}
 => {:if=>true} 

开始语句的所有关键字都表现出相同的行为。例如。 defdomodulecase

出现在中间的其他保留字和class 工作正常:elseend

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

【问题讨论】:

  • irb 有点脆弱,有相当多的脑损伤,你可能已经看到了一些。
  • @muistooshort 这似乎毫无根据。 echo 'puts {if: true}.inspect' > test.rb; ruby test.rb 返回:test.rb:1: syntax error, unexpected ':'irb 脆弱?
  • 哦,这很公平 :) 这一直困扰着我,但我想我从来没有真正在意过。
  • @nzifnab:也许你应该试试h = { if: 'b' };puts h.inspect

标签: ruby hash ruby-1.9 irb ruby-1.9.3


【解决方案1】:

可靠且明确地解析任何语言的内容都具有挑战性。当您开始使用保留字时尤其如此。而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 错误。

但是有可能或值得解决吗? @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

【讨论】:

  • 还值得注意的是,如果您引入分配,一切都会按预期工作。例如。 foo = {if: true} 在 MRI 中评估良好(尽管 IRB 仍然跳闸)。
  • @coreyward:确实。我试过这个。我将在我的答案中添加一段代码来澄清。谢谢!
  • 一切都很有趣。无论是在 ruby​​ 脚本还是在 IRB 中,OP 的示例都失败了,但是当你在 puts 周围加上括号时,它就可以工作了。多么混乱!我几乎希望他们只使用哈希火箭。更容易理解,陷阱也少得多(然后所有哈希值都相同,而不是 ' 带有字符串键的哈希使用火箭!带有保留标签的哈希使用火箭!符号有时应该使用标签语法!)呃。
  • @nzifnab:您的评论中的 sometimes 很重要,您不能使用带有 :$set 等符号的 JavaScript 样式'正在使用 MongoDB。我只使用 hashrocket 是因为我知道如何打字,而且我有更重要的事情要担心,而不是何时可以使用和不能使用 JavaScript 样式表示法。
  • 只是为了平衡这次对话——我真的很喜欢新的语法({a: 'b'} 风格),因为我认为它确实减轻了代码的负担并使其更具可读性。我专门使用它,很少遇到问题。这不是一个大问题。我认为它类似于 ///* */ 对于单行 C cmets。
猜你喜欢
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2019-10-24
  • 1970-01-01
相关资源
最近更新 更多