开发者社区 问答 正文

传递块时Array#sort如何工作?

我在理解如何array.sort{ |x,y| block }精确工作方面存在问题,因此如何使用它?

Ruby文档中的一个示例:

a = [ "d", "a", "e", "c", "b" ] a.sort #=> ["a", "b", "c", "d", "e"] a.sort { |x,y| y <=> x } #=> ["e", "d", "c", "b", "a"] 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-08 20:00:40 425 分享 版权
1 条回答
写回答
取消 提交回答
  • 在你的例子中

    a.sort 相当于

    a.sort { |x, y| x <=> y } 如你所知,对数组排序,你需要能够比较它的元素(如果你怀疑,只是试图实现任何排序算法,而无需使用任何比较,没有<,>,<=或>=)。

    您提供的块实际上是一个函数,sort算法将调用该函数以比较两个项目。那就是x并且y将永远是sort算法在执行过程中选择的输入数组的某些元素。

    该sort算法将假定此比较功能/块将满足方法的要求<=>:

    如果x <y返回-1 如果x = y返回0 如果x> y返回1 无法提供足够的比较功能/块将导致数组的顺序不确定。

    您现在应该了解为什么

    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,等...)。

    2020-02-08 20:00:54
    赞同 展开评论
问答分类:
问答标签:
问答地址: