読者です 読者をやめる 読者になる 読者になる

みんなのちからになりたい

コピペでブログラムつくっていきたい

組み込みクラスのinitializeをoverrideする

昨日のやつの続きで組み込みクラスでも同じことやってみる。

標準で用意されてるクラスのinitializeをoverrideする - みんなのちからになりたい

今回はTimeで。

class Time
  def initialize(*args)
    p "kita!"
  end
  def aaa
    "aaa"
  end
end

p tt = Time.new(2013, 1, 31, 12, 20, 30)
p tt.day
p tt.aaa


$ ruby builtin2.rb
"kita!"
1970-01-01 09:00:00 +0900
1
"aaa"

きた。終了。

というわけにもいかないのでみてみると、普通にoverrideできるっぽい。
試しにStringでもやってみたけど同じようにできた。
できるのとできないのがあるのか...

とりあえずまえと同じくalias付けてnewでやってみる。

class Time
  class << self
    alias_method :orgnew, :new
    def new(*args)
      p "xxx"
      orgnew *args
    end
  end
  def initialize(*args)
    p "kita!"
  end
  def aaa
    "aaa"
  end
end

p tt = Time.new(2013, 1, 31, 12, 20, 30)
p tt.day
p tt.aaa


$ ruby builtin2.rb
"xxx"
"kita!"
1970-01-01 09:00:00 +0900
1
"aaa"

なんの問題もなく同じことできた。
ただ、今回はnewに入れた引数がかんぜんに無視されてるぽい。
ためしにinitializeをコメントしてみる。

class Time
  class << self
    alias_method :orgnew, :new
    def new(*args)
      p "xxx"
      orgnew *args
    end
  end
  # def initialize(*args)
  #   p "kita!"
  # end
  def aaa
    "aaa"
  end
end

p tt = Time.new(2013, 1, 31, 12, 20, 30)
p tt.day
p tt.aaa


$ ruby builtin2.rb
""xxx"
2013-01-31 12:20:30 +0900
31
"aaa"

ちゃんと動いてる。
こうなるとinitializeをTimeのinitializeに渡したい。
aliasでやってみる。

class Time
  class << self
    alias_method :orgnew, :new
    def new(*args)
      p "xxx"
      orgnew *args
    end
  end
  alias_method :orginitialize, :initialize
  def initialize(*args)
    p "kita!"
    orginitialize *args
  end
  def aaa
    "aaa"
  end
end

p tt = Time.new(2013, 1, 31, 12, 20, 30)
p tt.day
p tt.aaa


$ ruby builtin2.rb
"xxx"
"kita!"
2013-01-31 12:20:30 +0900
31
"aaa"

見事に通った。
こうなるとDateがなぜダメだったのかすごい気になる...