Ваш промежуточный итог работает в двух разных средах.
Один раз, это «автономный метод», в другой раз это числовой метод. Итак, давайте определим их как Числовой метод:
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)
Примечание к моему коду: я не вижу реальной причины для перехода на Float. Если вы начнете с 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)