2014年11月10日 星期一

[ Ruby Gossip ] Basic : 類別 - 建構、初始與消滅

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 來達到類似的效果。例如:
  1. class Some  
  2.     def initialize(value)  
  3.        @value = value  
  4.        ObjectSpace.define_finalizer(self,  
  5.                                     self.method(:finalize).to_proc)  
  6.     end  
  7.     def finalize(object_id)  
  8.         puts "Destroy #{object_id} Some(#{@value})...."  
  9.     end  
  10. end  
  11.   
  12. Some.new(10)  
  13. Some.new(20)  
  14. Some.new(30)  
  15.   
  16. ObjectSpace.garbage_collect   # 提示 GC  
執行結果如下:
Destroy 16096056 Some(30)....
Destroy 16096140 Some(20)....
Destroy 16096224 Some(10)....

Supplement
Object.method(sym) → method
Looks up the named method as a receiver in obj, returning a Method object (or raising NameError). The Method object acts as a closure in obj’s object instance, so instance variables and the value of self remain available.


沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...