Source From Here
Preface
定義類別之後,可以使用new方法來建構物件,實際上new是類別方法,預設的動作是配置新物件、以傳入的參數呼叫initialize方法進行物件初始化、傳回物件。
建構、初始與消滅
既然 new 是類別方法,你可以重新定義 new 方法。例如:
以上是個 new 方法的流程示意,allocate 方法會配置新物件,但不執行 initialize 方法,由於 initialize 方法是 private,所以無法透過 o.initialize 方式呼叫,而使用了 淺談物件、訊息與方法中談過的 send 方法呼叫,new 方法傳入的引數,會傳給 initialize 方法。
在介紹 陣列型態、雜湊型態 等物件時,介紹過new 方法可以指定程式區塊進行初始化,實際上程式區塊會傳給 initialize 方法,如果你在 initialize 方法中使用 yield,就可以執行程式區塊。例如:
如果要模擬以上行為,可以使用以下程式:
Ruby 中並不支援其它程式語言中解構方法的定義,不過可以透過 ObjectSpace.define_finalizer 來達到類似的效果。例如:
執行結果如下:
Supplement
* Object.method(sym) → method
Preface
定義類別之後,可以使用new方法來建構物件,實際上new是類別方法,預設的動作是配置新物件、以傳入的參數呼叫initialize方法進行物件初始化、傳回物件。
建構、初始與消滅
既然 new 是類別方法,你可以重新定義 new 方法。例如:
以上是個 new 方法的流程示意,allocate 方法會配置新物件,但不執行 initialize 方法,由於 initialize 方法是 private,所以無法透過 o.initialize 方式呼叫,而使用了 淺談物件、訊息與方法中談過的 send 方法呼叫,new 方法傳入的引數,會傳給 initialize 方法。
在介紹 陣列型態、雜湊型態 等物件時,介紹過new 方法可以指定程式區塊進行初始化,實際上程式區塊會傳給 initialize 方法,如果你在 initialize 方法中使用 yield,就可以執行程式區塊。例如:
如果要模擬以上行為,可以使用以下程式:
Ruby 中並不支援其它程式語言中解構方法的定義,不過可以透過 ObjectSpace.define_finalizer 來達到類似的效果。例如:
- class Some
- def initialize(value)
- @value = value
- ObjectSpace.define_finalizer(self,
- self.method(:finalize).to_proc)
- end
- def finalize(object_id)
- puts "Destroy #{object_id} Some(#{@value})...."
- end
- end
- Some.new(10)
- Some.new(20)
- Some.new(30)
- ObjectSpace.garbage_collect # 提示 GC
Supplement
* Object.method(sym) → method
沒有留言:
張貼留言