2011-06-09 42 views
14

已經寫了一個方法;當我嘗試運行它,我得到的錯誤:稱爲錯誤的私有方法

NoMethodError: private method ‘subtotal’ called for 39.99:Float 
at top level in grades.rb at line 9 
Program exited with code #1 after 0.04 seconds. 

以下是代碼:

def subtotal(qty = 1) 
    return nil if self.to_f <= 0 || qty.to_f <= 0 
    self.to_f * qty.to_f 
end 

book = 39.99 
car = 16789 

puts book.subtotal(3) 
puts car.subtotal 
puts car.subtotal(7) 

回答

22

當您在任何類之外聲明一個方法時,它是一個私有方法,這意味着它不能在其他對象上調用。你應該打開你希望方法進入的類,然後把方法定義放在那裏。 (如果你想在多個類中使用它,可以打開一個公共超類,或者將其放入一個模塊中,並將該模塊包含在所有類中。)

+0

問題:如果我沒有定義類,它不應該默認爲對象類?那是我對Ruby會做什麼的理解。這種理解是不正確的? – pdenlinger 2011-06-09 19:52:33

+2

@pdenlinger:這是正確的,但它將其定義爲Object的*私有方法*。它不僅僅是一個默認範圍 - 它是一種特殊的行爲,旨在模仿像Python這樣的語言來定義函數。 – Chuck 2011-06-09 20:08:15

+1

知道了!非常感謝你的解釋。 – pdenlinger 2011-06-10 00:05:57

2

你的意思是包括方法subtotal到任何類?例如。

class Numeric 
    def subtotal(qty = 1) 
    return nil if self.to_f <= 0 || qty.to_f <= 0 
    self.to_f * qty.to_f 
    end 
end 
0

我在看這個,看你似乎被調用包含Float類的變量subtotal方法。這相當於Float.subtotal。現在,這個問題很容易看出來。您尚未將小計方法定義爲Float類的一部分。