手机
当前位置:查字典教程网 >脚本专栏 >ruby专题 >实例讲解Ruby中的钩子方法及对方法调用添加钩子
实例讲解Ruby中的钩子方法及对方法调用添加钩子
摘要:钩子方法有些类似事件驱动装置,可以在特定的事件发生后执行特定的回调函数,这个回调函数就是钩子方法(更形象的描述:钩子方法可以像钩子一样,勾住...

钩子方法有些类似事件驱动装置,可以在特定的事件发生后执行特定的回调函数,这个回调函数就是钩子方法(更形象的描述: 钩子方法可以像钩子一样,勾住一个特定的事件。),在Rails中beforeafter函数就是最常见的钩子方法。

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中的钩子方法及对方法调用添加钩子】相关文章:

详解Ruby中的代码块对象Proc

Ruby中Hash哈希结构的基本操作方法小结

Ruby中检测Gem是否安装的方法

详解Ruby中的循环语句的用法

Ruby中关于hash的基本使用方法

详解Ruby中的代码块及其参数传递

在Ruby on Rails中使用Markdown的方法

Ruby 中一些百分号(%)的用法小结

Ruby定义私有方法(private)的两种办法

详解Ruby中的instance_eval方法及其与class_eval的对比

精品推荐
分类导航