最近のキーワード

2006年07月15日

Array#===, Hash#===

Array#=== や Hash#=== を以下のように定義しておくと不都合がおきることは多いだろうか?
class Array
  def ===(ary)
    if super(ary)
      return true
    end
    if !ary.is_a?(Array)
      return false
    end
    each_with_index{|v,idx|
      case ary[idx]
      when v
      else
        return false
      end
    }
    true
  end
end

class Hash
  def ===(h)
    if super(h)
      return true
    end
    if !h.is_a?(Hash)
      return false
    end
    each{|k,v|
      case h[k]
      when v
      else
        return false
      end
    }
    true
  end
end
例えば、このように使える。条件分岐を簡単にしたいだけ。速度は落ちるだろうけど。まぁダメならArrayとHashのサブクラスを作ればいいだけだけど。
require 'rexml/parsers/baseparser'

x = REXML::Parsers::BaseParser.new('')
while (x.has_next?)
  case (e = x.pull)
  when [:start_element, "a", {"id"=>/\d+/}]
    puts("a")
  when [:start_element, "b", Hash]
    puts("b")
  when [:end_element, "a"]
    puts("/a")
  when [:end_element, "b"]
    puts("/b")
  end
end
posted by ttate at 03:02| 🌁| Comment(0) | TrackBack(0) | Ruby | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。