2011-06-09 57 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类的一部分。