Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

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