操作员和方法链接在红宝石中

时间:2012-05-29 10:30:23

标签: ruby

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

让我感到惊讶的是,"S"+"R".downcase导致Sr"S".+"R".downcase一样,"S".send(:+, "R").downcase最终给了我预期的输出sr

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


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

2 个答案:

答案 0 :(得分:4)

.的优先级高于+,并首先进行评估。 ("S"+"R").downcase也有效。

答案 1 :(得分: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派生。