Ruby - 使用Comparable mixin比较两个不同属性上的对象

Ric*_*kes 5 ruby comparable

是否有一种简单的方法(即使用太空船操作员)根据两个不同的属性在Ruby中定义比较?即如果我有一个包含两个属性attr1和attr2的类,是否有一种Rubyesque方法来比较attr1上这个类的两个实例,如果它们相等,那么在attr2上比较它们?

ste*_*lag 14

这是一种易于扩展(更多属性)的方式:

def <=>(other)
  [self.attr1, self.attr2] <=> [other.attr1, other.attr2]
end
Run Code Online (Sandbox Code Playgroud)


Gav*_*ler 7

可比混合的重点是为太空船(比较)运营商提供定义.因此,如果您想跨两个属性进行比较,那就去做吧.这是一个过于冗长的例子:

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

  if comparison == 0
    return self.attr2 <=> obj.attr2
  else
    return comparison
  end
end
Run Code Online (Sandbox Code Playgroud)

显然上面假设attr1,并且attr2两者都有航天器运营商的定义.同样,你需要确定什么构成大于,小于两个属性可能有点困难.这表明可比较可能不是您的方案的正确代码.


一种更为简洁和惯用的写作方式是:

def <=>(obj)
  self.attr1 <=> obj.attr1 == 0 ? self.attr2 <=> obj.attr2 : self.attr1 <=> obj.attr1
end
Run Code Online (Sandbox Code Playgroud)