实例讲解Ruby中的钩子方法及对方法调用添加钩子
钩子方法有些类似事件驱动装置,可以在特定的事件发生后执行特定的回调函数,这个回调函数就是钩子方法(更形象的描述: 钩子方法可以像钩子一样,勾住一个特定的事件。),在Rails中before\after函数就是最常见的钩子方法。
Class#inherited方法也是这样一个钩子方法,当一个类被继承时,Ruby会调用该方法。默认情况下,Class#inherited什么都不做,但是通过继承,我们可以拦截该事件,对感兴趣的继承事件作出回应。
class String def self.inherited(subclass) puts “#{self} was inherited by #{subclass}” end end class MyString < String; end输出:
String was inherited by MyString
通过使用钩子方法,可以让我们在Ruby的类或模块的生命周期中进行干预,可以极大的提高编程的灵活性。
对方法调用添加钩子的实例
ruby有很多有用的钩子,如included,inhered,以及method_missing。对方法调用添加钩子可以用alias环绕别名实现,但终归有些麻烦,alias_method_chain需要定义with_feature方法也较麻烦,因此实现了下列module,include后调用method_callback :before_method,:after_method即可为before_method添加after_method钩子
module AfterCall def self.included(base) base.extend(ClassMethods) end module ClassMethods def after_call when_call,then_call,*args_then,&block_then alias_method "old_#{when_call}",when_call define_method when_call do |*args_when,&block_when| send "old_#{when_call}",*args_when,&block_when send then_call,*args_then,&block_then end end end end class Student include AfterCall def enter_class sb puts "enter class #{sb}" yield('before') if block_given? end private def after_enter_class pop puts "after enter class #{pop}" yield('after') if block_given? end protected def third_after puts "from third enter" end after_call :after_enter_class ,:third_after after_call :enter_class ,:after_enter_class,"doubi", &lambda {|x|puts "from lambda #{x}"} end Student.new.enter_class "1" do |x| puts "from lambda #{x}" end
运行结果如下:
#enter class 1 #from lambda before #after enter class doubi #from lambda after #from third enter
相关文章
Ruby on Rails实现最基本的用户注册和登录功能的教程
这里我们主要以has_secure_password的用户密码验证功能为中心,来讲解Ruby on Rails实现最基本的用户注册和登录功能的教程,需要的朋友可以参考下...2020-06-30- 二分查找是一种在已经过排序的数组中搜索指定元素用的算法,这里我们就来看一下Ruby实现二分搜索(二分查找)算法的简单示例:...2020-06-30
- Ruby将字符串像数字一样处理.我们用单引号('...')或双引号("...")将它们括起来. ruby> "abc" "abc" ruby> 'abc' "abc" 单引号和双引号在某些情况下有不同的...2020-06-30
- Rack是一个连接Ruby程序与服务器程序之间的中间件,甚至可以说Rails也是在Rack的基础上建立起来的,这里我们就来为大家带来Ruby on Rails中Rack中间件的基础学习教程...2020-06-30
- C# Hook钩子实例代码之截取键盘输入,需要的朋友可以参考下...2020-06-25
- 钩子方法即是在普通的方法上添加"钩子",使特定事件发生时可以被调用,下面就来以实例讲解Ruby中的钩子方法及对方法调用添加钩子...2020-06-30
- Drupal可以让第三方模块创建自己的钩子。在通常的实践中,有两种类型的钩子你可能想要创建,一种是内容修改类的钩子,一种是拦截类的钩子。 Drupal的钩子系统允许和模...2016-11-25
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
这篇文章主要介绍了解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27- 单件方法顾名思义,就是只作用于单个对象的方法,同理单件类就是单件方法所存在的类,规定其作用域,这里我们就来详解Ruby中的单件方法和单件类:...2020-06-30
- gem是一种文件组织的包,一般的ruby的很多插件都有由这种各种的包提供。我们来看看gem的用法...2020-06-30
Ubuntu上配置Ruby on Rails框架及RubyMine IDE开发环境
Ruby on Rails是Ruby世界中当仁不让的Web框架代表,甚至可以说Rails推动了Ruby的流行,这里我们就来看一下如何在Ubuntu上配置Ruby on Rails框架及RubyMine IDE开发环境...2020-06-30Ruby 中的 module_function 和 extend self异同
本文主要给大家介绍了在Ruby中 module_function 和 extend self的共同点和区别,非常的详细,也很实用,方便大家更好的理解的module_function 和 extend self...2020-06-30Ruby on rails安装后去掉DL is deprecated,please use Fiddle警告信息的方法【测试可用】
这篇文章主要介绍了Ruby on rails安装后去掉DL is deprecated,please use Fiddle警告信息的方法,通过针对Ruby on rails安装文件中的警告部分源码进行注释来达到消除警告的目的,需要的朋友可以参考下...2020-06-30- 这篇文章主要介绍了ruby ftp封装实例详解的相关资料,需要的朋友可以参考下...2020-06-30
- 插入排序即是把已有的有序序列从后向前扫描插入元素,数值大的向后移动,这里我们就来看一下使用Ruby实现插入排序算法及进阶的二路插入排序代码示例...2020-06-30
java虚拟机钩子关闭函数addShutdownHook的操作
这篇文章主要介绍了java虚拟机钩子关闭函数addShutdownHook的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-20- Hash类型在Ruby中就相当于Python的字典,是一个键值对应的集合类型,这里就来整理一下Ruby中的Hash哈希类型基本操作方法小结:...2020-06-30
Ruby rails 页面跳转(render和redirect_to)
今天在做R.R.log的时候发现个问题,在修改密码的时候如果没有通过校验,没有显示校验错误的信息。...2020-06-30- 这篇文章主要介绍了C#键盘鼠标钩子的实现方法,以实例形式分析了针对键盘与鼠标钩子的实现步骤与相关技巧,并配有相关官方文档说明的地址,需要的朋友可以参考下...2020-06-25
- 在本篇文章里小编给大家分享了关于Ruby创建数组方法的知识点内容,对戏有兴趣的朋友们学习下。...2020-06-25