【发布时间】:2020-03-02 09:36:34
【问题描述】:
Ruby 新手。接收错误:
item_container.rb:14:in
add_item': undefined method
我知道这个错误是什么意思,但不明白是什么原因造成的以及如何解决?在制作ClassMethods、InstanceMethods 并添加回调之前一切正常。
#item_container.rb
module ItemContainer
module ClassMethods
def min_price
100
end
end
module InstanceMethods
def add_item(item)
unless item.price < self.class.min_price #<----- error line
@items.push item
end
end
end
def self.included(base)
base.extend ClassMethods
base.class_eval do
include InstanceMethods
end
end
end
#init.rb
require_relative "item_container"
require_relative "cart"
require_relative "order"
require_relative "item"
require_relative "virtual_item"
require_relative "real_item"
item1 = VirtualItem.new({ :price => 10, :name => "car" })
item2 = RealItem.new({ :price => 100, :weight => 20, :name => "kettle" })
item3 = RealItem.new({ :price=> 10, :weight => 100, :name => "dishwasher" })
cart = Cart.new
cart.add_item item1
cart.add_item item2
class Item
@@discount = 0.05
def self.discount
if Time.now.month == 2
@@discount + 0.1
else
@@discount
end
end
def initialize(options={})
@real_price = options[:price]
@name = options[:name]
end
attr_accessor :real_price
attr_reader :name
def info
yield(price)
yield(name)
end
def price
(@real_price - @real_price * self.class.discount) + tax if @realprice
end
private
def tax
type_tax = if self.class == VirtualItem
1
else
2
end
cost_tax = if @real_price > 5
@real_price * 0.2
else
@real_price * 0.1
end
cost_tax + type_tax
end
end
【问题讨论】:
-
item1.price和item2.price在cart = Cart.new行之前返回什么?我会在VirtualItem或RealItem类中查找此错误的原因,具体取决于我的第一个问题的答案。 -
报错说
item.price是nil,而nil没有方法<。但我不能告诉你为什么会这样,因为你没有提供minimal reproducible example。我的猜测是,在VirtualItem或RealItem的初始化方法中,您永远不会设置@price- 因此它仍然是nil。 -
一件商品的折扣和税收价格
-
不,具体来说,
item1.price和item2.price的结果是什么?其中一个大概是nil,是哪一个?
标签: ruby nomethoderror