📜  红宝石 |可枚举的 sort()函数(1)

📅  最后修改于: 2023-12-03 15:41:11.739000             🧑  作者: Mango

可枚举的 sort()函数与红宝石

在红宝石中,sort()函数是用来对数组进行排序的常用方法之一。除了常规的排序方式,sort()函数还提供了一些可枚举的选项来控制排序的行为。

基本用法

sort()函数的基本用法非常简单,它只需要一个可迭代的对象作为参数即可:

arr = [5, 2, 8, 1, 9]
arr.sort()
# 输出:[1, 2, 5, 8, 9]

默认情况下,sort()函数使用升序排序。如果要进行降序排序,可以使用块表达式:

arr.sort { |a, b| b <=> a }
# 输出:[9, 8, 5, 2, 1]

在块表达式中,我们比较了两个元素ab,用<=>(类似于cmp)符号表示它们之间的大小关系。根据上面的规则,如果b <=> a返回-1,那么b就会被排在a的前面。

其他可枚举的选项

除了块表达式外,sort()函数还提供了其他一些可枚举的选项,以控制排序的行为。

1. in_place

如果需要在原始数组上进行排序,而不是创建一个新的已排序数组,那么可以使用in_place选项:

arr = [5, 2, 8, 1, 9]
arr.sort! { |a, b| b <=> a }
# 输出:[9, 8, 5, 2, 1]
puts arr
# 输出:[9, 8, 5, 2, 1]

注意,这里要使用sort!而不是sort,因为sort!是在原始数组上进行排序的。

2. reverse

如果只是想简单地将数组反转,那么可以使用reverse选项:

arr = [5, 2, 8, 1, 9]
arr.sort.reverse
# 输出:[9, 8, 5, 2, 1]

注意,这里的sort()函数是用来升序排序的,而reverse选项只是将排序后的数组反转了一下。

3. sort_by

如果需要根据某个键或者属性进行排序,可以使用sort_by选项:

class Person
  attr_reader :name, :age
  
  def initialize(name, age)
    @name = name
    @age = age
  end
end

people = [ Person.new("Jane", 22), Person.new("John", 32), Person.new("Mary", 28) ]
people.sort_by { |person| person.age }
# 输出:[ #<Person:0x00007fb42d876728 @name="Jane", @age=22>, #<Person:0x00007fb42d8766b0 @name="Mary", @age=28>, #<Person:0x00007fb42d8767a8 @name="John", @age=32> ]

在这个例子中,我们定义了一个Person类,并将其实例放入到一个数组中。接着,我们使用sort_by选择器,来根据每一个Person对象的age属性进行排序。

4. sort_by!

sort!类似,sort_by!也是在原始数组上进行排序的:

people = [ Person.new("Jane", 22), Person.new("John", 32), Person.new("Mary", 28) ]
people.sort_by! { |person| person.age }
puts people.inspect
# 输出:[#<Person:0x00007fa0ae83ee48 @name="Jane", @age=22>, #<Person:0x00007fa0ae83ebe8 @name="Mary", @age=28>, #<Person:0x00007fa0ae83f2c0 @name="John", @age=32>]
总结

sort()函数为红宝石提供了一种灵活而又强大的排序方式。除了常规的排序方法外,它还提供了一些可枚举的选项(如in_placereversesort_by等),来满足不同的排序需求。