在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

ruby中的回调方法和钩子方法相关推荐

  1. JavaScript中的回调地狱及解决方法

    JavaScript中的回调地狱及解决方法 1.回调地狱 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱 ...

  2. Ruby中求50之内的素数方法

    ruby求50之内的素数的方法,感觉对比PHP和SHELL方法是最简单的,但SHELL中可以利用factor命令,而PHP中没有求素数的对应函数的,需要自己设计算法,三种方式大家对比学习下,应该还有更 ...

  3. 模板方法模式--钩子方法

    文章目录 前言 叙述 骨架方法 具体方法 抽象方法 钩子方法 钩子方法实现方式 方式一 方式二 小结 前言 说到模(mú)板,很多人都接触过,C++和Java都有诸如List和Stack这样的模板类. ...

  4. ruby 集合 分组_在Ruby中找到两个集合之间的区别

    ruby 集合 分组 Finding differences simply means that finding elements that are uncommon between two sets ...

  5. ruby 集合 分组_将Ruby中两个集合的所有元素结合在一起

    ruby 集合 分组 In this program, we will see how we can combine the two sets? This is not a very difficul ...

  6. 如何在Ruby中编写switch语句

    如何在Ruby中编写switch语句? #1楼 案例...当 在Chuck的答案中添加更多示例: 带参数: case a when 1puts "Single value" whe ...

  7. 回调函数在replace方法中的应用

    处理字符串是项目中经常会遇到的问题,对于长度比较大的字符串如何作一次性处理是需要我们去考虑的,这里给个例子: 把字符串"get-element-by-id"变成"getE ...

  8. Java中的钩子方法

    钩子方法是啥 钩子顾名思义就是用来挂东西的.那么要挂东西必须有个被挂的东西,要不就是铁环.要不就是墙的边沿.所以要能挂住东西必须要有个被勾住的铁环,要一个钩子.那么在java中也是同样的原理,你首先需 ...

  9. ruby hash方法_Ruby中带有示例的Hash.invert方法

    ruby hash方法 Hash.invert方法 (Hash.invert Method) In this article, we will study about Hash.invert Meth ...

最新文章

  1. 多模态人物识别技术及其在爱奇艺视频场景中的应用 | 公开课笔记
  2. “三板斧”式文化价值体系互助协作,打通企业全流程管理模式
  3. Confd+Consul 配置文件动态生成
  4. Linux ps aux指令詳解--转
  5. 苹果WWDC前瞻之iOS 13更新最受关注;微软发布基于区块链的去中心化身份识别系统;小米成立了新集团质量办公室……...
  6. 诗与远方:无题(十七)
  7. mysql5.6触发器,MYSQL5.6创建存储过程和触发器
  8. python按键退出循环_Python的for循环退出
  9. Linux 迅雷 chrome插件,Chrome(Chromium)迅雷下载支持扩展1.1测试版【更新】
  10. 安徽 gis epsg
  11. Flutter仿京东商城项目实战视频教程
  12. 建立正确的目标收益率
  13. 彻底删除手机系统软件
  14. Echarts图例位置 - legend属性
  15. HTML5期末大作业:基于HTML+CSS+JavaScript仿蘑菇街购物商城设计毕业论文源码
  16. 批量识别PDF/OFD/PNG/JPG电子发票到EXCEL
  17. html单元格上下拆分代码,在HTML/CSS如何垂直拆分表格单元格(特别版)
  18. [美文]你懂得这些,才可能比别人更优秀!
  19. 开发那点事(十五)微信小程序webView首次进入白屏优化方案
  20. 锁模块之当前读和快照读

热门文章

  1. 负数在计算机怎样表示与存储
  2. keras的学习笔记
  3. 马云狂炸近百亿,你的借呗额度涨了吗?
  4. 征信逾期了,5年后能自动消除吗?
  5. 这些明星日入斗金,为什么还要贷款?
  6. PIC32单片机harmony开发环境 - i2c例程和代码分析
  7. java复制的函数会报错,2 面试题之面向对象
  8. c语言程序后退_c语言中向后退一格是啥符号?
  9. mysql数据库常用操作
  10. 调研Android的开发环境的发展演变