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