ruby中的回調方法和鉤子方法

來源:互聯網
上載者:User

標籤:style   blog   color   strong   div   代碼   new   log   

  在ruby中,當某些特定的事件發生時,將調用回調方法和鉤子方法。事件有如下幾種:

  • 調用一個不存在的對象方法
  • 類混含一個模組
  • 定義類的子類
  • 給類添加一個執行個體方法
  • 給對象添加一個單例方法
  • 引用一個不存在的常量

  對以上的事件,都可以為之編寫一個回調方法,當該事件發生時,這個回調方法被執行。這些回調方法是針對某個對象,或者某個類的,而不是全域的。

 

下面給出一些例子:

  1 Method_missing攔截不能識別的訊息

  在前面說過,根據物件模型來進行方法尋找,如果沒有找到,會拋出一個NoMethodError異常,除非定義了一個名為method_missing的方法。

如下:

1 class C2     def method_missing(m)3         puts "there is no method #{m}"4     end5 end6 C.new.hello

輸出:

there is no method hello

  類C中沒有定義執行個體方法hello(它的方法尋找路徑上也沒有),因此調用method_missing。

 

  2 用Module#included捕捉混含操作

  當一個模組被混入到類(或者另一個模組)中,如果該模組的included方法已經定義,那麼該方法就會被調用。該方法的參數就是混入該模組的類。

如下: 

1 module M2     def self.included(c)3         puts "module M is included by #{c}"4     end5 end6 class C7     include M8 end

輸出:

module M is included by C

  當模組M被混入到C中,模組M的included方法被調用了。

  這種方式可以用來定義類方法,如上面的代碼中,在self.included中就可以定義類c的類方法,或者給單例類添加一個模組

如下:

 1 module M 2     def self.included(c) 3         puts "module M is included by #{c}" 4  5         def c.m1 6             puts "this is class #{c}‘s  class method m1 " 7         end 8  9         c.extend(N)10     end11     module N12         def method13             puts "hello world"14         end15     end16 end17 class C18     include M19 end20 p C.singleton_methods

輸出:

module M is included by C
[:m1, :method]

  如代碼,5-7行定義了一個類方法,該類是包含模組M的類(此例中就是C),9行將模組N加入了該類的單例類中。在20行的輸出類C的單例方法可以看出加入成功。

 

  3 用Class#inherited攔截繼承

  當為一個類定義了inherited方法,那麼在為它產生子類時,inherited會被調用,唯一的調用參數就是新的子類的名字。

如下:

1 class C2     def self.inherited(subclass)3         puts "#{self} got a new subclass #{subclass} "4     end5 end6 class D < C7 end8 class E < D9 end

輸出:

C got a new subclass D
D got a new subclass E

  當D繼承C時,調用了這個鉤子方法,輸出C got a new subclass D。同時,D的單例類中也有了C的類方法,因此在E繼承D時,也會調用調用D的這個鉤子方法。

 

  4 Module#const_missing

  當給定的模組或者類中引用了一個不可識別的常量時,該方法被調用。

如下:

1 class C2     def self.const_missing(const)3         puts "#{const} is undefined-setting "4         const_set(const,1)5     end6 end7 puts C::A

輸出

A is undefined-setting
1

  常量A沒有被定義,因此調用了const_missing方法。在方法中把它定義為1。

 

  5 Module#method_added

  當新定義一個方法時,會調用這個方法。

如下:

1 module M2     def self.method_added(method)3         puts "method #{method} is added in M"4     end5     def m16     end7 end

輸出

method m1 is added in M

 

ruby中鉤子方法很多,覆蓋了絕大多數值得注意的事件。這裡只給出一些常見的,給自己參考,給大家參考。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.