1

我在编写的程序中遇到了一些让我感到困惑的结果。我的理解是通常不需要括号(即obj.method1.method2与 一样好(obj.method1).method2)。此外,所有运算符都是真正的方法调用,所以我希望它们的行为相似。

所以想象一下我的惊喜"S"+"R".downcase导致了Sr"S".+"R".downcase最终"S".send(:+, "R").downcase给了我预期的输出sr

这是因为操作员快捷方式的处理方式不同,还是我在这里缺少其他一些机械师?


编辑:问题不在于导致答案的操作顺序,这很明显。问题是为什么这个表达式是按这个顺序解决的。

4

2 回答 2

4

.优先级高于+并且首先被评估。("S"+"R").downcase也可以。

于 2012-05-29T10:48:41.503 回答
1

如果你的 Ruby >= 1.9,你可以检查它是如何用 Ripper 解析的:

require 'ripper'
require 'pp'

src = '"A"+"B".downcase'
pp Ripper::SexpBuilder.new(src).parse

您将看到方法调用(来自“。”)比二进制加号具有更高的优先级:

[:program,
 [:stmts_add,
  [:stmts_new],
  [:binary,
   [:string_literal,
    [:string_add, [:string_content], [:@tstring_content, "A", [1, 1]]]],
   :+,
   [:call,
    [:string_literal,
     [:string_add, [:string_content], [:@tstring_content, "B", [1, 5]]]],
    :".",
    [:@ident, "downcase", [1, 8]]]]]]

如果您熟悉 bison/yacc,也可以直接从 Ruby 的parse.y导出运算符的优先级。

于 2012-05-29T11:00:23.117 回答