2013-02-27 296 views
0

在理解ruby的過程中,我試圖用默認參數值覆蓋'+'。像這樣的東西。覆蓋'+'方法

class C 
    def something(a = 5) 
    puts "Received: #{a}" 
    end 

    def +(b = 10) 
    puts "Received: #{b}" 
    end 
end 

現在

x = C.new 
x.something #=> Received: 5 
x.something(88) #=> Received: 88 

x.+ #=> IRB shows ? whereas I was expecting an output 'Received: 10' 

這是因爲運算符優先級?

+0

'x.send(:+)'會顯示你的期望。我相信解釋者在+之後會期待一種方法或變量。 – Gazler 2013-02-27 14:17:44

+0

Gazler,太棒了。 send()按預期工作。現在我瞭解了send的實際用法。 – Bala 2013-02-27 14:24:56

+0

@Bala發送所有方法調度... – texasbruce 2013-02-27 14:37:53

回答

2

IRB被解析+並期待爲二元操作的第二個參數。如果您提供括號,它可以正常工作:

x.+() #=> Received: 10 
4

IRB問題(看起來像它不處理這種情況)。如果創建單獨的.rb文件,並運行它,你會得到預期的輸出:

Received: 5 
Received: 88 
Received: 10 
1

IRb使用與Ruby不同的解析器。所以,在一些奇怪的角落案例中,IRB可能比Ruby更不同地解析代碼。如果你想知道Ruby是否有效,你應該問Ruby不是IRb。

原因主要是Ruby總是一次解析整個文件,所以它總是知道表達式何時結束。另一方面,IRB必須在每次按「」時都「猜測」輸入您是否僅僅希望繼續使用新的表達式,或者是否要按原樣評估表達式。因此,IRb 不能使用只是使用Ruby解析器,它需要有它自己的。 Ruby的語法非常複雜,編寫自己的解析器真的很難。這就是爲什麼這樣的錯誤和角落案例不時出現,即使在一個像IRB那樣老舊和廣泛使用的軟件中也是如此。