我在编写的程序中遇到了一些令我困惑的结果。我的理解通常不需要parens(即obj.method1.method2
和(obj.method1).method2
一样好。此外,所有运算符都是方法调用,因此我希望它们的行为类似。
让我感到惊讶的是,"S"+"R".downcase
导致Sr
和"S".+"R".downcase
一样,"S".send(:+, "R").downcase
最终给了我预期的输出sr
这是因为操作员快捷方式的处理方式不同,还是有其他一些我缺少的机制?
编辑:问题不在于导致答案的操作顺序,这是显而易见的。问题是为什么表达式按此顺序解决。
答案 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派生。