Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Ruby で Web2.0(笑) - てっく煮ブログ
[go: Go Back, main page]

Hatena::Diary

てっく煮ブログ

2007年12月07日

Ruby で Web2.0(笑)

Ruby 勉強第2弾。前回の スイーツ(笑)で関数定義 に引き続いて、今回はクラスと 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(オー)で代用してます。

トラックバック - http://d.hatena.ne.jp/nitoyon/20071207/ruby_abc2
おとなり日記