昨日のやつの続きで組み込みクラスでも同じことやってみる。
標準で用意されてるクラスの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がなぜダメだったのかすごい気になる...