实例讲解Ruby中的钩子方法及对方法调用添加钩子

所属分类: 脚本专栏 / ruby专题 阅读数: 1504
收藏 0 赞 0 分享

钩子方法有些类似事件驱动装置,可以在特定的事件发生后执行特定的回调函数,这个回调函数就是钩子方法(更形象的描述: 钩子方法可以像钩子一样,勾住一个特定的事件。),在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的基础语法入门学习教程

这篇文章主要介绍了Ruby的基础语法入门学习教程,包括空白和保留字等书写的基本知识点,需要的朋友可以参考下
收藏 0 赞 0 分享

实例解析Ruby中的数值类型以及常量

这篇文章主要介绍了Ruby中的数值类型以及常量,是Ruby入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

Ruby on Rails中jquery_ujs组件拖慢速度的问题解决

这篇文章主要介绍了Ruby on Rails中jquery ujs组件拖慢速度的问题解决,jquery_ujs是Rails框架中涉及AJAX交互的组件,需要的朋友可以参考下
收藏 0 赞 0 分享

编写Ruby脚本来对Twitter用户的数据进行深度挖掘

这篇文章主要介绍了编写Ruby脚本来对Twitter用户的数据进行深度挖掘的一些例子,通过调用Twitter API来实现各种功能(内地注意墙),需要的朋友可以参考下
收藏 0 赞 0 分享

对优化Ruby on Rails性能的一些办法的探究

这篇文章主要介绍了对优化Ruby on Rails性能的一些办法的一些探究,包括避免内存密集型的应用和GC等相关问题的探讨,需要的朋友可以参考下
收藏 0 赞 0 分享

Ruby程序中创建和解析XML文件的方法

这篇文章主要介绍了Ruby程序中创建和解析XML文件的方法,创建用builder库,解析用ReXML库,需要的朋友可以参考下
收藏 0 赞 0 分享

Ruby在cmd下中文显示乱码以及不支持OpenSSL的问题解决

这篇文章主要介绍了Ruby在cmd下中文显示乱码以及不支持OpenSSL的问题解决,其中OpenSSL的相关编译操作在Linux环境下进行,需要的朋友可以参考下
收藏 0 赞 0 分享

借助RubyGnome2库进行GTK下的Ruby GUI编程的基本方法

这篇文章主要介绍了借助RubyGnome2库进行GTK下的Ruby GUI编程的基本方法,介绍了基本的UI和事件响应的相关实现,需要的朋友可以参考下
收藏 0 赞 0 分享

简单谈谈Ruby的private和protected

Ruby类下对访问控制的限制也是用public,protected和private来做的。虽然用的是和C++和Java相同的名字,但是Ruby下的protected和private定义还是有所不同的。
收藏 0 赞 0 分享

ruby中的双等号==问题详解

Ruby里面有4种比较方法,equal?, eql?, ==, ===,而且在不同的类里面表现的很不一样。在使用的时候也特别容易搞糊涂。 本文先给大家讲述一下==号的用法及使用中应该注意的地方
收藏 0 赞 0 分享
查看更多