是否有一种简单的方法(即使用 spaceship 操作符)基于两个不同的属性在Ruby中定义比较? IE。如果我有一个包含两个属性attr1和attr2的类,是否有一种Rubyesque方式在attr1上比较该类的两个实例,如果它们相等,则在attr2上进行比较?

最佳答案

可比的mixin的全部要点是为飞船(比较)运算符提供一个定义。因此,如果您想对两个属性进行比较,则可以进行比较。这是一个过于冗长的示例:

def <=>(obj)
  comparison = self.attr1 <=> obj.attr1

  if comparison == 0
    return self.attr2 <=> obj.attr2
  else
    return comparison
  end
end

显然,以上假设attr1attr2都具有针对飞船运算符的定义。同样,您还需要确定什么构成大于和小于,这在两个属性之间可能有点困难。这表明可比性可能不是适用于您的方案的正确代码。

一种更简洁和惯用的书写方式是:
def <=>(obj)
  self.attr1 <=> obj.attr1 == 0 ? self.attr2 <=> obj.attr2 : self.attr1 <=> obj.attr1
end

关于ruby - Ruby-使用Comparable mixin比较两个不同属性上的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8123676/

10-10 09:42