• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    实例讲解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中的钩子方法详解
    • Ruby中钩子方法的运用实例解析
    上一篇:Ruby面向对象编程中类的方法与类的扩展
    下一篇:Ruby on Rails中Rack中间件的基础学习教程
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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