难以解决基本的RubyMonk练习

时间:2014-05-13 20:20:29

标签: ruby

在此页面上: https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/105-equality_of_objects

我正在尝试更正此代码,以便通过其测试。 我的尝试非常糟糕,因为我刚刚开始学习软件逻辑的工作原理。

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 ✔

3 个答案:

答案 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)

当您向下滚动查看问题时,您将看到下一个示例提供了明确的解决方案。