【发布时间】:2016-02-11 17:52:34
【问题描述】:
假设我定义了元素之间的<=> 关系,使其不是顺序关系(即,它不满足一些自反性、反对称性、传递性)。
class Scissors
def <=> other
case other
when Scissors then 0
when Paper then 1
when Rock then -1
end
end
end
class Paper
def <=> other
case other
when Scissors then -1
when Paper then 0
when Rock then 1
end
end
end
class Rock
def <=> other
case other
when Scissors then 1
when Paper then -1
when Rock then 0
end
end
end
当我在这些元素之间调用sort(非Schwartzian比较)时,我得到了一定的结果:
scissors = Scissors.new
paper = Paper.new
rock = Rock.new
[rock, paper, scissors].sort
# =>
# [
# #<Rock:0x007f7a64ffaa10>,
# #<Paper:0x007f7a64ffaa38>,
# #<Scissors:0x007f7a64ffaa60>
# ]
[scissors, paper, rock].sort
# =>
# [
#<Scissors:0x007f7a64ffaa60>,
#<Rock:0x007f7a64ffaa10>,
#<Paper:0x007f7a64ffaa38>
# ]
sort 在这种情况下遵循什么逻辑?
【问题讨论】:
-
看起来这将是非常特定于实现的。我们可以假设您专门指的是 MRI 吗?
-
排序谓词需要严格的排序,如果比较 scissors-paper-rock,情况并非如此。对于一个大组,分区排序将选择一个元素,然后将所有小于它的元素放在一侧,将所有大于另一侧的元素放在一边,所以你最终会得到所有的文件,然后是所有的剪刀,然后是所有的石头,如果枢轴Picked 是一个剪刀对象。如果一个不同的人最终会在中间。