2007年12月07日
Ruby で Web2.0(笑)
Ruby 勉強第2弾。前回の Ruby で スイーツ(笑)関数 に引き続いて、今回はクラスと Mix-in を試してみた。
ModuleO に O というメソッドを定義しておき、クラスメソッド、インスタンスメソッド、特異メソッドとして Mix-in している。
# モジュールを定義
module ModuleO
def O(*args)
# クラスを取得する
cls = self.kind_of?(Class) ? self : self.class
# <class name>.0 を出力
print "#{cls.to_s}.0"
# 引数があれば出力
unless args.empty?
print "(#{args[0].to_s})"
end
# 改行
puts
end
end
# クラスメソッドとして Mix-in
class Web2
extend ModuleO
end
# インスタンスメソッドとして Mix-in
class DoCoMo2
include ModuleO
end
ドコモ2 = DoCoMo2.new
# 特異メソッドとして Mix-in
ActionScript3 = "AS3"
ActionScript3.extend ModuleO
# 実験!
Web2.O("笑") # Web2.0(笑)
ドコモ2.O("笑") # DoCoMo2.0(笑)
ActionScript3.O # String.0
ポイント
どのケースでもクラスを取得するために
self.kind_of?(Class) ? self : self.class
と書いてみた。
クラスメソッドとして Mix-in されるときは、self はクラス自身を指す(上の例だと Web2 クラス)。だから、self.kind_of?(Class) は true になる。
インスタンスメソッドおよび特異メソッドとして Mix-in されるときは、self がインスタンスを指す(上の例だと ドコモ2 と ActionScript3)。なので、self.kind_of?(Class) は false になって、self.class でクラスを取得している。
もっといい書き方はあるんだろか。
ちなみに
Web2.O とあるけど、メソッド名に 0(ゼロ)は使えないので、大文字の O(オー)で代用してます。