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

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

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

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

?

下面給出一些例子:

  1?Method_missing攔截不能識別的消息

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

如下:

1 class C
2     def method_missing(m)
3         puts "there is no method #{m}"
4     end
5 end
6 C.new.hello

輸出:

there is no method hello

  類C中沒有定義實例方法hello(它的方法查找路徑上也沒有),因此調用method_missing。

?

  2?用Module#included捕捉混含操作

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

如下: 

1 module M
2     def self.included(c)
3         puts "module M is included by #{c}"
4     end
5 end
6 class C
7     include M
8 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     end
11     module N
12         def method
13             puts "hello world"
14         end
15     end
16 end
17 class C
18     include M
19 end
20 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 C
2     def self.inherited(subclass)
3         puts "#{self} got a new subclass #{subclass} "
4     end
5 end
6 class D < C
7 end
8 class E < D
9 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 C
2     def self.const_missing(const)
3         puts "#{const} is undefined-setting "
4         const_set(const,1)
5     end
6 end
7 puts C::A

輸出

A is undefined-setting
1

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

?

  5 Module#method_added

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

如下:

1 module M
2     def self.method_added(method)
3         puts "method #{method} is added in M"
4     end
5     def m1
6     end
7 end

輸出

method m1 is added in M

?

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

?

轉載于:https://www.cnblogs.com/smallbottle/p/3901096.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260147.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260147.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260147.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

超簡單的JNI——NDK開發教程

不好意思各位&#xff0c;我按照網上一些教程進行JNI開發&#xff0c;折騰了半天也沒成功&#xff0c;最后自己瞎搞搞定了&#xff0c;其實超簡單的&#xff0c;網上的教程應該過時了&#xff0c;最新版的AS就包含了NDK編譯的功能&#xff0c;完全不用手動javah&#xff0c;各種…

查詢工資最低的3名員工的職工工號、姓名和收入_關于工資條,這6個常識必須掌握,事關你的權益!...

大狀說&#xff1a;找大狀&#xff0c;中小企業自己的法律顧問。今天為大家帶來的文章&#xff0c;是《關于工資條&#xff0c;這6個常識必須掌握&#xff0c;事關你的權益&#xff01;》&#xff0c;是關于勞動法的內容&#xff0c;希望能給大家帶來幫助。1、單位不發工資條的…

oracle查對象創建時間,oracle:查詢某個時間之后,指定用戶,指定對象類型,并創建的表的個數...

SQL> select COUNT(*) from dba_objects where created< to_date(17-01-14,dd-mm-yy) AND owner用戶名 and object_typeTABLE;查詢某個時間之后創建的表有哪些&#xff1a;SQL> select object_name,created from dba_objects where created> to_date(17-01-14,dd-…

年末跳槽

末日過了&#xff0c;大家都在準備著年會&#xff0c;年總結&#xff0c;年終獎。 而我卻在煩著跳槽的事。 由于一個偶遇的機會&#xff0c;最近面試了公司B&#xff0c;面試過程還可以&#xff0c;跟公司B的技術管理人談得還挺開心的。他也同意我的技術。 開始的時候&#xff…

SQL之用戶自定義函數

關于SQL Server用戶自定義的函數&#xff0c;有標量函數、表值函數&#xff08;內聯表值函數、多語句表值函數&#xff09;兩種。 題外話&#xff0c;可能有部分朋友不知道SQL Serve用戶自定義的函數應該是寫在哪里&#xff0c;這里簡單提示一下&#xff0c;在Microsoft SQL Se…

hdoj3351-stack

Problem DescriptionI’m out of stories. For years I’ve been writing stories, some rather silly, just to make simple problems look difficult and complex problems look easy. But, alas, not for this one.You’re given a non empty string made in its entirety f…

vb語言程序設計_如果編程語言難度決定頭發濃度,學這語言的可能要光頭了

對于程序員來說&#xff0c;頭發真的比什么都重要&#xff0c;甚至很多程序員&#xff0c;大量的人民幣都花在了后續植發上。甚至網上還流行這么一句話&#xff0c;你發際線越高&#xff0c;編程能力越高&#xff0c;那對于程序員來說&#xff0c;那么多語言&#xff0c;到底哪…

oracle同義詞很慢,通過問題長知識----ORACLE同義詞

現象&#xff1a;create table JBPM_JOB時出錯&#xff0c;提示name is used by existing object而drop table 的時候&#xff0c;卻報table or view does not exist.這是一個很矛盾的現象。排查&#xff1a;select * from user_objects where OBJECT_NAME ‘JBPM_JOB’—注意字…

C#獲取程序集的版本號和最后編譯時間

C#獲取程序集的版本號&#xff1a;string ver System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); C#中如何將記錄項目的最后編譯時間&#xff1a;在實際的軟件開發工作中&#xff0c;我們通常需要記錄某個工程的最后編譯時間&#xff0c;原來…

無刷新上傳Excel后利用JQuery AJAX 顯示進度條的實現方式

1、前臺上傳頁面代碼 <div class"clearfix mywebsite-nodata"><div id"show"><form action"<?site_url(user/upload)?>" target"ifmupload" id"myform" method"post" accept-charset"…

怎么理解python語言_Python語言入門1-理解Python語言

本文主要向大家介紹了Python語言入門的理解Python語言&#xff0c;通過具體的內容向大家展現&#xff0c;希望對大家學習Python語言入門有所幫助。python是解釋型的腳本語言解釋型語言與C/C等編譯型語言相比&#xff0c;python語言的程序并不是首先編譯成二進制機器碼后運行&am…

SD Card Formatter for Mac Download

https://www.sdcard.org/downloads/formatter_4/eula_mac/ SDFormatter Mac版是一款Mac OS平臺上的sd卡修復工具&#xff0c;SDFormatter是一款比較好用的SD卡格式化工具&#xff0c;能夠格式化SD存儲卡和SDHC記憶Card&#xff08;SD/SDHC 存儲卡&#xff09;&#xff0c;使用遵…

linux刪除用戶oracle用戶名,linux添加用戶useradd 刪除用戶userdel

1.作用useradd或adduser命令用來建立用戶帳號和創建用戶的起始目錄&#xff0c;使用權限是超級用戶。2.格式useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name3.主要參數-c&#xff1a;加上備注文字&#xff0c…

Asp.net創建偽靜態頁面

下面是我研究了好幾天和同事一起才研究出來的&#xff0c;原創。 1偽靜態的定義&#xff1a; 偽靜態是相對真實靜態來講的&#xff0c;通常我們為了增強搜索引擎的友好面&#xff0c;都將文章內容生成靜態頁面&#xff0c;但是有的朋友為了實時的顯示一些信息。或者還想運用動態…

Spring 管理Bean(獲取Bean,初始化bean事件,自動匹配ByName······等)

1.實例化spring容器 和 從容器獲取Bean對象 實例化Spring容器常用的兩種方式&#xff1a; 方法一: 在類路徑下尋找配置文件來實例化容器 [推薦使用] ApplicationContext ctx new ClassPathXmlApplicationContext(new String[]{"beans.xml"}); 方法二: 在文件系統路徑…

directoryinfo 讀取 映射磁盤_LoaRunner性能測試系統學習教程:磁盤監控(5)

上期我們講到LoaRunner性能測試內存監控&#xff0c;這期我們講LoaRunner性能測試磁盤監控。磁盤監控在介紹磁盤監控前&#xff0c;先介紹固定磁盤存儲管理的性能&#xff0c;固定磁盤存儲器的結構層次如圖所示。每個單獨的磁盤驅動器稱為一個物理卷&#xff08;PV&#xff09;…

Eclipse新建web項目正常啟動tomcat不報錯,但不能訪問項目的解決方法

原因: 雖然我手動添加了自己下載的tomcat,但是由于在Eclipse中創建Server時&#xff0c;“Server Locations”選項采用的時默認配置&#xff0c;即"Use workspace metadata(does not modify tomcat installation ),這意味著該Server不會改變TOMCAT的安裝及部署目錄&#…

oracle10g執行insert,oracle 10g 增強審計。表insert 及bind values

oracle 10g之前&#xff0c;可以審計對表的操作&#xff0c;但不能記錄操作時的各個列的值。在10g中&#xff0c;已經可以審核并監控到具體的sql語句及內容了。要求10g以后的版本。alter system set audit_traildb_extended scopespfile;[more]示例&#xff1b;SQL> show us…

點擊按鈕 變換圖片

<html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>變換圖片</title><script type"text/javascript">function chan…

[鄰接表] 學習鄰接表的表示方法+BFS

算法導論上面的偽代碼實現哦&#xff0c;沒啥技術&#xff0c;不過這個鄰接表表示法&#xff08;figo大神教的&#xff09;很nice。 簡單說一下&#xff0c;head里面是放著自己節點后面鏈的最后一個元素在邊池中的位置&#xff0c;邊池里面成一個一個鏈狀&#xff0c;像并查集&…