为什么1 + 1在Ruby中工作,而不是其他方法?

时间:2014-03-26 02:59:23

标签: ruby

在Ruby中,可以将1.+(1)重写为1 + 1。但是,对于其他方法(例如1.to_s)无法执行此操作,并将其重写为1to_s1 to_s。这是为什么?

换句话说,为什么可以调用1+1而不能调用其他方法?除了其他方法之外,这是否是口译员允许的精确性?

请注意,这适用于其他数学运算符/方法,例如/**

2 个答案:

答案 0 :(得分:4)

对于方法调用a + b

a.+(b)只是syntactic sugar(对于其他运算符也是如此)。此转换在解析期间完成。你可以看到它here, in ruby's bison grammar。特别是,rule for a + b使用call_bin_op来构造要返回的抽象语法树节点,a macro that forwards to call_bin_op_gencalls NEW_CALLbuilds an AST node representing a method call

答案 1 :(得分:1)

正如您所述:“在Ruby中,一切都是对象”,因此您可以做的所有事情最终都是方法调用。让1+1调用#+()对象Fixnum的{​​{1}}方法涉及一些语法糖(你实际上不能像@Ismail Badawi所指出的那样定义它,它是ruby语言定义的一部分。)

但是,由于1已经 一个方法调用,所以你无能为力。您可以将其称为to_s,但如果不涉及歧义,则只能省略1.to_s(),并且您的示例中肯定会有一些歧义。