我在理解 array.sort{ |x,y| 的方式时遇到问题 block }
工作正常,因此如何使用它?
来自 Ruby documentation 的示例:
a = [ "d", "a", "e", "c", "b" ]
a.sort #=> ["a", "b", "c", "d", "e"]
a.sort { |x,y| y <=> x } #=> ["e", "d", "c", "b", "a"]
最佳答案
在你的例子中
a.sort
相当于
a.sort { |x, y| x <=> y }
如您所知,要对数组进行排序,您需要能够比较其元素(如果您怀疑这一点,只需尝试在不使用任何比较的情况下实现任何排序算法,不是 <
、 >
、 <=
或 >=
)。
您提供的 block 实际上是一个函数,sort
算法将调用该函数来比较两个项目。 即 x
,y
将始终是 sort
算法在执行期间选择的输入数组的一些元素。
sort
算法将假定此比较函数/ block 将满足方法 <=>
的要求:
- 如果 x < y 则返回 -1
- 如果 x = y 则返回 0
- 如果 x > y 则返回 1
未能提供足够的比较函数/ block 将导致数组的顺序未定义。
你现在应该明白为什么了
a.sort { |x, y| x <=> y }
和
a.sort { |x, y| y <=> x }
以相反的顺序返回相同的数组。
详细说明 Tate Johnson 添加的内容,如果您在任何类上实现比较函数 <=>
,您将获得以下内容
- 您可以在类中包含模块
Comparable
,它将自动为您定义以下方法:between?
、==
、>=
、<
、<=
和>
。 - 现在可以使用对
sort
的默认(即不带参数)调用对您的类的实例进行排序。
请注意,在 ruby 的标准库(<=>
、Bignum
、Array
、File::Stat
、Fixnum
、String
等)中任何有意义的地方都已经提供了 Time
方法。
关于arrays - 传递 block 时 Array#sort 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2637419/