让我们从d.sort. d是一个数组,所以你应该阅读关于Array#sort. 文档说排序“将使用<=>运算符完成”。这意味着在对数组进行排序时,它将反复评估的不同元素x <=> y在哪里x和y是d,以确定哪些元素更大/更小。
Ruby 中的运算符有点棘手,因为它们实际上是变相的方法调用。x <=> y只是写法不同而已x.<=>(y)。也就是说,x有一个名为的方法,它作为参数<=>传递。y由于元素d是Age类的实例,Age需要定义实例方法<=>。因此,当您看到时def <=> (other),这实际上与普通方法定义 ( def foo(other)) 没有什么不同,只是方法名称不同。
现在我们正在<=>为Age实例定义,该方法实际上应该做什么?那么每个Age对象都存储一个@value,所以直观地Age#<=>应该比较@values。就是self.value <=> other.value这样。这是可行的,因为value返回 a Fixnum,幸运Fixnum#<=>的是,Ruby 内置了可以进行正确比较。
对于幕后发生的事情的示例,我们可以尝试对包含我们不知道如何比较的值的数组进行排序:
[Age.new(3), 4].sort
# NoMethodError: undefined method `value' for 4:Fixnum
[4, Age.new(3)].sort
# ArgumentError: comparison of Fixnum with Age failed
这显示了对不同类型的排序如何导致<=>调用不同的方法。