【发布时间】:2022-01-20 12:27:01
【问题描述】:
https://stackoverflow.com/a/11427868/936494 已经有一个相关问题,但我想了解的是
使用时
a.sort { |x, y| x <=> y }
它如何知道这个块应该按升序排序并且在使用时类似
a.sort { |x, y| y <=> x }
它怎么知道这个块应该按降序排序?我很困惑,因为这两个块都使用了 spaceship 运算符,并且在 a.sort { |x, y| x <=> y } 的情况下,预计在每次比较期间都会返回以下内容@
- -1 如果 x
- 0 如果 x == y
- 1 如果 x > y
在a.sort { |x, y| y <=> x }的情况下进行每次比较
- -1 如果 y
- 0 如果 y == x
- 1 如果 y > x
现在让我们举个例子:
2.3.2 :023 > a = [ "d", "a", "e", "c", "b" ]
=> ["d", "a", "e", "c", "b"]
当我们使用a.sort { |e1, e2| p [e1, e2]; e1 <=> e2 } 对其进行排序时,结果如下:
["d", "a"] (cmp result: 1)
["c", "b"] (cmp result: 1)
["e", "b"] (cmp result: 1)
["e", "c"] (cmp result: 1)
["a", "b"] (cmp result: -1)
["d", "b"] (cmp result: 1)
["d", "c"] (cmp result: 1)
["d", "e"] (cmp result: -1)
=> ["a", "b", "c", "d", "e"]
现在在这种情况下,它是如何知道将“a”放在第一位,然后是“b”,然后是“c”等等?
类似地,当我们使用a.sort { |e1, e2| p [e2, e1]; e2 <=> e1 } 对其进行排序时,结果如下:
["a", "d"] (cmp result: -1)
["b", "c"] (cmp result: -1)
["c", "e"] (cmp result: -1)
["e", "d"] (cmp result: 1)
["c", "d"] (cmp result: -1)
["c", "a"] (cmp result: 1)
["b", "a"] (cmp result: 1)
=> ["e", "d", "c", "b", "a"]
那么在这种情况下,它是如何知道将“e”放在第一位,然后是“d”,然后是“c”等等?并且考虑到两个元素的比较这一事实在这两个块中应该返回 1、0 还是 -1?
【问题讨论】:
-
您的比较误导了您。您必须将
x<=>y中的第一个项目符号点与y<=>x中的最后一个项目符号点进行比较,反之亦然:x < y等同于y > x,x > y等同于y < x。