在 Ruby mixin 编程之 - Comparable ( 可比较的 ) mixin 章节中我们学习了 Comparable mixin。包含了 Comparable
mixin 的类必须实现 <=>
方法。
当实现了 <=>
方法之后,就可以调用 Enumerable#sort
方法对一组 profiles
进行排序。
事实上,默认情况下,sort
方法会通过 <=>
方法来处理每个项的比较问题
irb> profiles = [] => [] irb> 10.downto(5) { |n| profiles << Profile.new(rand(1..n)) } => 10 irb> profiles => [ #<Profile:0x00007fda9a079be0 @rank=8>, #<Profile:0x00007fda9a079af0 @rank=6>, #<Profile:0x00007fda9a079a00 @rank=3>, #<Profile:0x00007fda9a079910 @rank=1>, #<Profile:0x00007fda9a079820 @rank=2>, #<Profile:0x00007fda9a079708 @rank=4> ] irb> profiles.sort => [ #<Profile:0x00007fda9a079be0 @rank=1>, #<Profile:0x00007fda9a079af0 @rank=2>, #<Profile:0x00007fda9a079a00 @rank=3>, #<Profile:0x00007fda9a079910 @rank=4>, #<Profile:0x00007fda9a079820 @rank=6>, #<Profile:0x00007fda9a079708 @rank=8> ]
Comparable#between
同样,我们再来学习另一个方法 Comparable#between?
,该方法允许我们判断一个对象是否包含在一个序列 ( 列表 ) 之内
irb> 12.between?(0, 24) => true irb> 'aaa'.between?('bbb', 'ccc') => false
由于我们在 Profile
类中包含了 Comparable mixin,因此我们可以使用 between?
方法
irb> profile21 = Profile.new(21) => #<Profile:0x0404 @rank=21> irb> profile42 = Profile.new(42) => #<Profile:0x0405 @rank=42> irb> profile84 = Profile.new(84) => #<Profile:0x0406 @rank=84> irb> profile42.between?(profile21, profile84) => true irb> profile21.between?(profile21, profile84) => true irb> profile84.between?(profile21, profile84) => true
结束语
Ruby 中涉及到比较相关的操作一般都要 mixin Comparable。当实现了太空船运算符 <=>
之后,就可以做很多操作了
目前尚无回复