2
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,如果它们相等,如何使它们为 true,如果它们不相等,如何使它们为 false

4

3 回答 3

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不知道如何比较您的对象。所以 ruby​​ 比较两个地址(存储对象的地方)并说这两个地址是不同的。

如果你在你的类中指定==操作符,ruby 现在知道如何比较你的对象。

于 2013-09-18T07:05:42.333 回答
0

People post answers too fast. Anyway, this code works:

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)
于 2013-09-18T07:12:22.773 回答
0

首先,如果你正确地格式化你的代码并且小心地表达你的问题以便你被理解,你会得到更多的回应。

其次,您可以从 Ruby 文档中找到 Ruby 处理相等性。Ruby 有许多不同类型的等号。它们被实现为对象上的方法(就像 ruby​​ 中的大多数/所有东西一样)。

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

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

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

于 2013-09-18T07:08:51.270 回答