对于“小于”,“等于”和“大于”,<=>
方法应该分别返回-1
,0
或1
。对于某些类型的可排序对象,基于多个属性的排序顺序是正常的。下面的作品,但我认为它看起来笨拙:复杂的比较有一个漂亮的语法吗?
class LeagueStats
attr_accessor :points, :goal_diff
def initialize pts, gd
@points = pts
@goal_diff = gd
end
def <=> other
compare_pts = points <=> other.points
return compare_pts unless compare_pts == 0
goal_diff <=> other.goal_diff
end
end
尝一尝:
[
LeagueStats.new(10, 7),
LeagueStats.new(10, 5),
LeagueStats.new(9, 6)
].sort
# => [
# #<LS @points=9, @goal_diff=6>,
# #<LS @points=10, @goal_diff=5>,
# #<LS @points=10, @goal_diff=7>
# ]
Perl将0
为假值,允许不同的语法复杂的比较:
{
return ($self->points <=> $other->points) ||
($self->goal_diff <=> $other->goal_diff);
}
我发现0
通过||
操作符易于阅读和优雅翻倒。我喜欢使用||
的一件事是一旦比较结果有一个值,计算的短路。
我在Ruby中找不到类似的东西。有没有更好的方法来构建相同的比较复合体(或其他任何选择第一个非零项),理想情况下无需事先计算所有值?
这很酷,但我希望LeagueStats有一个固有的排序顺序,这是他们的目的。 –
@NeilSlater,好的,我添加了另一个源自sawa答案的代码。 – falsetru