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.mzph.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;像并查集&…