在Ruby中,可以将1.+(1)
重写为1 + 1
。但是,对于其他方法(例如1.to_s
)无法执行此操作,并将其重写为1to_s
或1 to_s
。这是为什么?
换句话说,为什么可以调用1+1
而不能调用其他方法?除了其他方法之外,这是否是口译员允许的精确性?
请注意,这适用于其他数学运算符/方法,例如/
和**
。
答案 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_gen
,calls NEW_CALL
,builds an AST node representing a method call。
答案 1 :(得分:1)
正如您所述:“在Ruby中,一切都是对象”,因此您可以做的所有事情最终都是方法调用。让1+1
调用#+()
对象Fixnum
的{{1}}方法涉及一些语法糖(你实际上不能像@Ismail Badawi所指出的那样定义它,它是ruby语言定义的一部分。)
但是,由于1
已经 一个方法调用,所以你无能为力。您可以将其称为to_s
,但如果不涉及歧义,则只能省略1.to_s()
,并且您的示例中肯定会有一些歧义。