2014-01-26 122 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標記)。