2014-01-26 118 views
2

假设我们有一个类红宝石操作和方法调用

class Foo 
    def + (element); end 
    def add (element); end 
end 

现在,我们可以调用像这两种方法:

foo = Foo.new 
foo.+('bar') 
foo.add('bar') 

这就是合理的。这是调用方法的正确方法。

我的问题是:为什么我们可以这样做:

foo + 'bar' 

但不是:

foo add 'bar' 

是否红宝石区分,如果方法的名称实际上是运算符重载?它是如何工作的?

+0

不是一个坏问题! +1 –

+1

Ruby将表示运算符的字符串与其他字符串区分开来。所以当你做'def +'时,它知道你正在定义(或超载)一个现有的操作符。由于'add'不是一个操作符,因此它被视为一种常规方法。您可以使用gem来定义自定义运算符,如下所述:http://stackoverflow.com/questions/11874579/define-custom-ruby-operator – lurker

+0

mbratch,我想接受您的问题! – squixy

回答

0

这是很多人称之为Ruby的语法糖的东西之一。该语言可识别这些数学运算符以及其他ASCII符号运算符,如<<插入运算符,并允许使用空格和方法点调用它们。这允许更方便地使用该方法。

您的#add方法不被Ruby识别为标准运算符,因此不执行此语法帮助。

0

Ruby将不同地称为((子集))运算符的特定方法名。它们可以被调用而没有点.,可以被置于一个拥有对象(不需要参数,即一元运算符),并且具有不同的优先顺序,然后是标准方法。

Here是具体`运营商'方法的固定列表,它们不是关键字,可以定义或重载(用Y标记)。