iT邦幫忙

DAY 17
0

Ruby女孩:10萬.times { puts "為什麼?" }系列 第 17

Ruby女孩(17):自己做排序的方法!

  • 分享至 

  • xImage
  •  

※ 物件的次序

昨天在提及相等性時,其中一個方法就是==,今天我們在物件的次序的比較時也可以採用<=>方法,以Integer來說,數字本身就有大小的差別,根據<=>方法會有三種結果:

4 <=> 5
=> -1    #當左邊小於右邊時,會回傳-1。

4 <=> 4
=> 0     #當左邊等於右邊時,會回傳0。

4 <=> 3
=> 1     #當左邊大於右邊時,會回傳1。

"hi" <=> 5
=> nil   #兩邊為不同類別,是無法比較的,會回傳nil。

像這種次序的比較方式,通常會引用Comparable模組(module),而成為一個mixin(混成)(書中指出在第七章會詳細說明mixin)。

不過其實可以這麼想,當我想要幫物件做排序時,可能會有我自己希望的排序方法,例如我有一個人類的類別,但我們無法直接對兩個人做排序,此時我可以自己定義按照人類的年齡來做排序,我們可以這麼寫:

class Person
  include Comparable
 
  attr_accessor :age
 
  def initialize(age)
    @age = age
  end
 
  def <=> (another_person)
    age <=> another_person.age
  end
 
end
 
otis = Person.new(23)
 
annie = Person.new(18)
 
annie > otis  => false

這個範例是指,如果有個類別叫做Person,我們可以引入Comparable模組,並給他們年齡這個屬性,可以直接看在class中的<=>方法,此為我們自己定義的方法,我們把年齡的比較給寫了進去,此時新增兩個人類物件Annie和Otis,並給他們年齡值,此時就可以直接對這兩個物件做比較。

甚至可以幫一個陣列做排序:

[younger, young, old, older] = [16, 28, 43, 66].map { |age| Person.new( age ) }
#上面這行是在陣列中存入4個人類物件,並且給他們年齡定為16, 28, 43, 66

#當我們自己亂排,再用.sort來排序:
[older, young, younger, old].sort
=> [younger, young, old, older]

很酷吧!感覺這是非常方便的一種做法!

=================================================

17天,

覺得為時已晚的時候,恰恰是最早的時候 - 哈佛大學圖書館牆上的訓言

只要開始,就不嫌晚,堅持下去吧!


上一篇
Ruby女孩(16):物件之間相等性的比較
下一篇
Ruby女孩(18):自己的類別自己做啦!
系列文
Ruby女孩:10萬.times { puts "為什麼?" }30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言