让我们从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#<=>
应该比较@value
s。就是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
这显示了对不同类型的排序如何导致<=>
调用不同的方法。