【发布时间】:2013-06-24 21:51:32
【问题描述】:
我如何预测 Ruby 将如何解析事物?
我在尝试连接字符串时遇到了一个非常令人惊讶的 Ruby 解析错误。
> "every".capitalize +"thing"
=> NoMethodError: undefined method `+@' for "thing":String
当然,如果你把多余的空间放在它们里面,它会按预期工作;
> "every".capitalize + "thing"
=> "Everything"
如果我有anything.any_method +"any string",就会出现这个错误。 Ruby 所做的是假设我们已经省略了括号,并试图为该方法提供一个参数;
"every".capitalize( +"thing" )
它注意到我们没有在字符串上定义一元运算符+@,并抛出该错误。
我的问题是,我应该使用什么原则来预测 Ruby 解析器的行为?经过大量的谷歌搜索后,我才发现了这个错误。值得注意的是,.capitalize 从来没有接受过参数(甚至在 C 源代码中也没有)。如果您使用不适用于前一个对象的方法,它仍然会抛出 +@ 错误而不是 undefined method 'capitalize' for "every":String 错误。所以这个解析显然是高级别的。我没有足够的知识阅读 Matz 的parser.y。我遇到了其他类似的令人惊讶的错误。谁能告诉我 Ruby 的解析优先级?
【问题讨论】:
-
BNF 格式的Ruby grammar 也有,比 parser.y 文件的密度要小一些。
标签: ruby parsing lexical-analysis lexical-scope