にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

ComparableをMixinしてみる

Rubyで作っているちょっとしたシミュレータでイベント管理をするために、イベント(Eventクラス)とイベント管理のテーブル(EventTable)をそれぞれちまちま作っていたのですが、最初は各イベントが自作オブジェクトなため、ちまちまリンクトリストみたいなのを実装していました。しかし、ComparableモジュールをMixinして、<=>メソッドを定義すれば、便利なメソッドを使ったりできるとのことで、やってみました。

class Event
  include Comparable # Mixin
  attr_reader :time, :node, :job

  def initialize time_at, node, job
    @time  = time_at
    @node  = node
    @job   = job
  end

  def <=>(other)
    self.time <=> other.time
  end
end

class EventTable
  def initialize
    @table = []
  end

  def push event
    return unless event.instance_of?(Event)
    @table.push event
    @table.sort # sorted by time
  end # push

  def pop
    @table.shift
  end
end

こうすれば、例えば、イベントテーブルにイベントがpushされたときに時系列順にソートしておくことができ、取り出すときも簡単になります。
初めてMixin使ってみましたが、便利ですね。EnumerableをMixinする便利なコードも練習で書いてみたいと思います。