用户定义的对象相等性始终返回false

时间:2013-09-18 07:01:11

标签: ruby

Class Product
  def initialize(name, qty)
    @name = name
    @qty = qty
  end

  def to_s
    "#{@name}, #{@qty}"
  end
end


irb> Product.new("Amazon", 3) == Product.new ("Amazon", 3)
irb> false

Ruby总是为这些类型的用户定义对象返回false,这些对象是错误的,如果它们相等则如何使它们成立,如果它们不相等则为false

3 个答案:

答案 0 :(得分:4)

您应该实现比较运算符。

示例:

Class Product
  attr_reader :name, :qty

  def initialize(name, qty)
    @name = name
    @qty = qty
  end

  def to_s
    "#{@name}, #{@qty}"
  end

  def ==(another_product)
    self.name == another_produc.name and self.qty == another_product.qty
    # or self.to_s == another_product.to_s
  end
end

更多信息:ruby equality and object comparison


说明:

在您的示例中,ruby 不知道如何比较您的对象。所以ruby会比较两个地址(存储对象的位置),并说这两个地址是不同的。

如果您在班级中指定==运算符,ruby现在知道如何来比较您的对象。

答案 1 :(得分:0)

首先,如果您正确格式化代码并且小心地说出您的问题以便理解您,您将获得更多回复。

其次,你可以从Ruby文档中找到Ruby处理等式。 Ruby有许多不同类型的equals。它们作为对象上的方法实现(作为ruby中的大部分/全部内容)。

Object具有默认实现。 http://ruby-doc.org/core-2.0.0/Object.html

==默认情况下会检查实例是否相同(地址和全部)。

您可以将其覆盖为类中的方法,以提供更好的含义。

答案 2 :(得分:0)

人们发布的答案太快了。无论如何,这段代码有效:

class Product
  attr_reader :name, :qty

  def initialize(name, qty)
    @name = name
    @qty = qty
  end

  def ==(other_product)
    name == other_product.name && qty == other_product.qty
  end
end

Product.new("Amazon", 3) == Product.new("Amazon", 3)