Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

Comparebleを使って自前クラスにsortの挙動を実装する

今回はComparebleを使って自前クラスにsortの挙動を実装します。
正確には、sort内で判定に使われる"<=>"メソッドの挙動を定義する事で実現します。

class Book
  include Comparable

  attr_accessor :name, :genre
  
  def initialize(name,  genre=nil)
    @name  = name
    @genre  = genre
  end

  def <=>(other)
    t = @genre.to_s <=> other.genre.to_s
    return t if t != 0
    return @name <=> other.name
  end
  
end 

これを実際つかってみると...

require 'pp'

ary = []
ary << Book.new('foo',  'Linux')
ary << Book.new('bar',  'AVR')
ary << Book.new('buzz', 'AVR')

ary.sort.each {|io| pp io}    # => [#<Book:0x007fbb7a8f3990 @name="bar", @genre="AVR">, #<Book:0x007fbb7a8f3918 @name="buzz", @genre="AVR">, #<Book:0x007fbb7a8f3a08 @name="foo", @genre="Linux">]
# >> #<Book:0x007fbb7a8f3990 @genre="AVR", @name="bar">
# >> #<Book:0x007fbb7a8f3918 @genre="AVR", @name="buzz">
# >> #<Book:0x007fbb7a8f3a08 @genre="Linux", @name="foo">

こんな感じでソートされます。
読み出し済なモデルをちょいちょいとソートして配列にぶっ込んだり、
いやそもそもDBなんか使いたく無いって場合には有効です...かね?

つづき

多少理解が進んだので、続きを書きましたshuzo-kino.hateblo.jp