Ruby mixin 编程之 - Comparable mixin ( 下 )

yufei       6 年, 3 月 前       715

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。当实现了太空船运算符 <=> 之后,就可以做很多操作了

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.