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する便利なコードも練習で書いてみたいと思います。