free as in air

2007|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|09|11|12|
2012|03|04|05|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|03|04|06|09|
トップ «前の日記(2007-11-27) 最新 次の日記(2007-11-30)» /編集

2007-11-28 [長年日記]

§ [ruby] String#initializeが呼ばれない

irb(main):029:0> class String
irb(main):030:1> alias_method :original_initialize, :initialize
irb(main):031:1> def initialize(str = '')
irb(main):032:2> original_initialize(str)
irb(main):033:2> @double = str*2
irb(main):034:2> end
irb(main):035:1> attr :double
irb(main):036:1> end
=> nil
irb(main):037:0> x = ""
=> ""
irb(main):038:0> x.double
=> nil
irb(main):039:0> x = String.new("hoge")
=> "hoge"
irb(main):040:0> x.double
=> "hogehoge"
irb(main):041:0>                                   

 呼ばれてほしい訳ではないが。

 ソース見りゃ済む話だけど、要は自分で定義したクラスとかだとrb_class_new_instance()からrb_obj_call_init()が呼ばれるのだが、CレベルでStringを生成する際は大概rb_str_new2?を使用する故initializeが呼ばれぬのだよ。

 ruby_1_8の話であり他は知らん。