一直试图让以下代码工作,但不能;它说我正在调用私人方法。
我做错了什么?
def subtotal(price, qty = 1)
return nil if price.to_f<= 0 || qty.to_f <= 0
price.to_f * qty.to_f
end
puts subtotal(12.93)
puts subtotal(12.93, 3)
puts subtotal(456.82, 6)
def subtotal(qty = 1)
return nil if price.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)
答案 0 :(得分:0)
虽然我想了解更多信息,比如完整的类定义和错误跟踪,因为公共方法to_f
是此处唯一的其他方法调用,我猜测subtotal
已定义作为私人方法。
在Ruby类定义中,public
,protected
和private
等关键字适用于关键字之后的所有方法。检查类subtotal
中的private
定义是否低于protected
或{{1}}。
如果没有,那么问题可能在其他地方。检查错误跟踪,并查看错误实际的来源。
答案 1 :(得分:0)
您的小计适用于两种不同的环境。
有一次,它是一种“独立的方法”,另一次是一种数字方法。所以,让我们将它们定义为Numeric-method:
def subtotal(price, qty = 1)
return nil if price <= 0 || qty <= 0
price * qty
end
class Numeric
def subtotal(qty = 1) #only one paramter. The other is 'self'
return nil if self <= 0 || qty <= 0
self * qty
end
end
puts subtotal(12.93)
puts subtotal(12.93, 3)
puts subtotal(456.82, 6)
book = 39.99
car = 16789
puts book.subtotal(3)
puts car.subtotal
puts car.subtotal(7)
备注我的代码:我没有看到转换为Floats的真正原因。如果你从Fixnums开始(参见你的汽车示例),那么我的解决方案也可以。也许,您需要根据具体情况进行转换。
从您的示例代码中我更喜欢定义一个Articcle类:
def subtotal(price, qty = 1)
return nil if price <= 0 || qty <= 0
price * qty
end
class Article
def initialize(price = 0)
@price = price
end
def subtotal(qty = 1)
return nil if @price <= 0 || qty <= 0
@price * qty
end
end
puts subtotal(12.93)
puts subtotal(12.93, 3)
puts subtotal(456.82, 6)
book = Article.new(39.99)
car = Article.new(16789)
puts book.subtotal(3)
puts car.subtotal
puts car.subtotal(7)