2011年11月20日日曜日

オープンクラス

Rubyのオープンクラス


クラスの定義をいつでも変更できる。

class NilClass
  def blank?
    true
    print "NilClass\n"
  end
end

class String
  def blank?
    self.size == 0
    print "String\n"
  end
end

["", "person", nil].each do | element |
  puts element unless element.blank?
end

実行結果

c:\code>ruby blank.rb
String

String
person
NilClass

まず最初の
""
が、Stringクラスなので、
Stringクラスに定義したblank?が呼ばれる。
そして、self.size==0がtrueとなるので、
unlessの左辺は実行されない。
(unlessはifの反対、falseのときに実行される。)

次に、"person"だが、
これもStringなので、Stringクラスのblank?が呼ばれる。
そして、self.size==0がfalseとなるので、
unlessの左辺が実行される。
その結果、personという文字列が表示されている。

最後に、nilだが、
これはNilClassなので、NilClassのblank?が呼ばれる。
そして、これが呼ばれた時には無条件でtrueを返す。
よって、unlessの左辺は実行されない。
よって、表示はNilClassと出力されるだけである。

オープンクラスは便利。

使えるようになっていきたい。


0 件のコメント:

コメントを投稿