Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 |

2006-08-20(Sun)

オブジェクトの比較

Ruby勉強

自分で定義したクラスオブジェクト同士の比較を行いたい場合はComparableをインクルードして、演算子<=>を定義する。演算子<=>はクラス内の要素の何を比較するかの定義。これによってobja == objb 等の比較の記述ができる。

Enumerableをインクルードしてeachメソッドを定義することで、上記のComparableをインクルードを行ったクラスオブジェクト集合に対して#sort、#collect、#max他の処理が行えるようになる。

下記の例ではMIMEタイプを保持するクラスMimeと、Mimeクラスのオブジェクトの集合を扱うMimeListを定義している。

class Mime
  include Comparable   # <=>を定義する必要あり
  attr_reader :string, :main, :sub

  def initialize(str = "")
    if str =~ /\//
      @string = str.strip
      @main , @sub = @string.split(/\//)
    else
      @string, @main, @sub = "", "", ""
    end
  end
  
  # 何について比較を行うかの定義
  # ここでは@mainと@subのStringの文字コード比較
  # もし@mainが同じであれば@subで比較を行う
  def <=>(other)
    ret = @main <=> other.main
    return ret if ret != 0
    @sub <=> other.sub
  end
end

class MimeList
  include Enumerable  # eachを定義する必要あり
                      # 対象クラスには<=>が定義されている必要あり
  attr_reader :list
  
  def initialize
    @list = Array.new
  end
  
  # Mimeオブジェクトをリストに追加
  def add(mime)
    @list.push(mime)
  end
  
  def each
    @list.each{|mime| yield mime}
  end
end


w = Mime.new("application/excel")
x = Mime.new("application/excel")
y = Mime.new("text/html")
z = Mime.new("application/x-tar")

p w == x # => ture
p w  > x # => false
p w  > y # => false
p z  > w # => true

mimelist = MimeList.new
mimelist.add(w)
mimelist.add(x)
mimelist.add(y)
mimelist.add(z)


# リスト中のMimeオブジェクトをアルファベット順にソート
sorted =  mimelist.sort
sorted.each{|mime| puts "#{mime.string}"}
  # => application/excel
  # => application/excel
  # => application/x-tar
  # => text/html

# 逆順でソート
sorted =  mimelist.sort{|a,b| b <=> a}
sorted.each{|mime| puts "#{mime.string}"}
  # => text/html
  # => application/x-tar
  # => application/excel
  # => application/excel

p mimelist.max.string # => text/html

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hake/20060820/p1