【问题标题】:ruby 1.9.x, weird parsing, what's going on?ruby 1.9.x,奇怪的解析,这是怎么回事?
【发布时间】:2011-10-27 21:36:13
【问题描述】:

我什至不知道给这个标题是什么。有人可以向我解释这里到底发生了什么吗?这是对我真正在做的事情的简化,当然,如果是这样的话,会有一种更简单的方法来做到这一点,但为什么 ruby​​ 1.9.x 解析器在 1.8.x 中遇到问题并且看起来很简单?

 (rdb:2) struct = Struct.new(:foo, :bar).new
 (rdb:2) p struct.send( ( "foo".to_s +'=') , "VALUE")
 NoMethodError Exception: undefined method `+@' for "=":String

什么?但这很好用:

 (rdb:2) struct.send( ("foo".to_s) +'=') , "VALUE")

啊等等,这个也是,我猜现在'+'运算符和第二个值之间需要一个空格?

 (rdb:2) p struct.send( ( "foo".to_s + '=') , "VALUE")

什么鬼? Ruby 1.8.x 现在可以正常使用了。等等,ruby 1.9.x 支持一元前缀运算符之类的,它说如果我不留下空格,字符串就没有一元前缀运算符“+”?

嗯?谁能解决这个问题?

【问题讨论】:

  • "foo".to_s +'=' - 在这种情况下,Ruby 认为+"="to_s 的参数。喜欢:"foo".to_s(+"=")
  • 第二个例子有不匹配的括号。除此之外,对于所有三个代码示例,我在 Ruby 1.8.7 p352 和 1.9.2 r32553 中都有相同的行为。
  • 如果一些东西不能被编译器解析,它通常也不能被人类明确地解析。

标签: ruby ruby-1.9


【解决方案1】:

Ruby 1.8.7 还支持一元 +,并为 +'=' 提供相同的错误。

我假设解析逻辑发生了一些变化,+'=' 在您的表达式中被解析为一元加号。我不会认为这是一个错误。

【讨论】:

  • 作为旁注:Ruby 语言是否有任何“正式”规范?巴库斯-瑙尔之类的?
  • this question。 (简短回答:否)
  • 因此,根据定义,这样的解析怪癖不可能是错误,因为解析器没有“正确”的行为。
  • 据我所知,由核心团队决定什么是错误和什么是“功能”。虽然我想它们应该符合官方草案规范,但这只是官方的 1.8,而不是 1.9。
  • 奇怪,我在 1.8.7 中也遇到了同样的行为。我发誓我有一个从 1.8.7 升级到 1.9.2 的应用程序,该应用程序开始提出以前从未提出过的问题……但显然我没有正确隔离演示案例。我可能没有意愿去查看我的差异/日志并弄清楚此时真正发生了什么。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多