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 は 2 つのアドレス (オブジェクトが格納されている場所) を比較し、2 つのアドレスが異なると判断します。

クラスで==演算子を指定すると、Ruby はオブジェクトを比較する方法を知るようになります。

于 2013-09-18T07:05:42.333 に答える