我正在尝试更正此代码,以便通过其测试。 我的尝试非常糟糕,因为我刚刚开始学习软件逻辑的工作原理。
class Item
attr_reader :item_name, :qty
def initialize(item_name, qty)
@item_name = item_name
@qty = qty
end
def to_s
"Item (#{@item_name}, #{@qty})"
end
def ==(other_item)
end
end
p Item.new("abcd",1) == Item.new("abcd",1)
p Item.new("abcd",2) == Item.new("abcd",1)
这是我的解决方案,但不正确:
class Item
attr_reader :item_name, :qty
def initialize(item_name, qty)
@item_name = item_name
@qty = qty
end
def to_s
"Item (#{@item_name}, #{@qty})"
end
def ==(other_item)
if self == other_item
return true
else
return false
end
end
end
p Item.new("abcd",1) == Item.new("abcd",1)
p Item.new("abcd",2) == Item.new("abcd",1)
我希望那里的Rubyist可以帮我解决这个问题。我不确定如何解决它。
感谢您的帮助
这是测试的输出:
STDOUT:
nil
nil
Items with same item name and quantity should be equal
RSpec::Expectations::ExpectationNotMetError
expected Item (abcd, 1) got Item (abcd, 1) (compared using ==) Diff:
Items with same item name but different quantity should not be equal ✔
Items with same same quantity but different item name should not be equal ✔
答案 0 :(得分:4)
当您覆盖==
方法时,您应该为比较赋予意义。默认的==
行为会检查其他项与相同到比较项(它们具有相同的object_id)。试试这个:
def ==(other_item)
other_item.is_a?(Item) &&
self.item_name == other_item.item_name &&
self.qty == other_item.qty
end
答案 1 :(得分:3)
可以指出正确的方向,而不是说出答案。
您正在比较对象的引用是否相等,而要求仅比较这些属性是否相等。也就是说,比较两个对象参数,如果它们相等,则必须返回true
;别的false
答案 2 :(得分:1)
当您向下滚动查看问题时,您将看到下一个示例提供了明确的解决方案。