美文网首页
ruby钩子

ruby钩子

作者: SecondRocker | 来源:发表于2015-05-29 18:19 被阅读197次

ruby有很多有用的钩子,如included,inhered,以及method_missing。对方法调用添加钩子可以用alias环绕别名实现,但终归有些麻烦,alias_method_chain需要定义with_feature方法也较麻烦,因此实现了下列module,include后调用method_callback :before_method,:after_method即可为before_method添加after_method钩子,目前方法不可传参,目前没有解决思路

module MethodCallback
  def self.included(base)
    base.extend ClassMethods
  end
  module ClassMethods
    def method_callback(before_m,after_m)
      target_with = "#{before_m}_with_#{after_m}}"
      target_without = "#{before_m}_without_#{after_m}"
      alias_method target_without, before_m
      define_method before_m do
        eval(target_without)
        eval(after_m.to_s)
      end
      alias_method target_with, before_m
    end
  end
end

class Student
  include MethodCallback
  def enter_class
    puts "enter class"
  end
  def after_enter_class
    puts "after enter class"
  end
  method_callback :enter_class ,:after_enter_class
end
Student.new.enter_class

今天又重新思考了下,参数问题得以解决,代码如下

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有很多有用的钩子,如included,inhered,以及method_missing。对方法调用添加钩子...

  • 盐津大关河边有一棵红毛悬钩子树

    开花的悬钩子 是悬钩子 不开花的悬钩子 还是悬钩子 大关河边的悬钩子 不开花 就没有果实 没有果实的悬钩子 谁会在...

  • vue路由钩子

    路由钩子 1.全局钩子2.某个路由独享钩子3.组件内钩子 全局钩子 beforeEach(全局前置守卫)、afte...

  • Git钩子详解

    Git钩子详解 钩子 Git钩子是在Git仓库中特定事件发生时自动运行的脚本。可以定制一些钩子,这些钩子可以在特定...

  • Windows消息钩取

    下钩子函数: 钩子的过程需要在DLL内部 dwThreadId为0时 钩子为全局钩子 hMod就当成dll的句柄(...

  • 钩子,钩子,都是钩子,果真是个钩子

    每年都要流行新的东西,别的不知道,要说今年流行的装饰元素,那非黄铜莫属。 其实早在公元1230年,黄铜制品就开始在...

  • SVN钩子随笔

    通过SVN钩子限制提交的条件 1. "钩子"是什么? 钩子, 通常意义上讲就是可以钩到某个事物上, 而这里的钩子其...

  • git hook

    钩子定义 Git 可以定制一些钩子,这些钩子可以在特定的情况下被执行,分为 Client 端的钩子和 Server...

  • Cocoapods笔记

    一、安装 查看ruby的版本 ruby -v 查看ruby的源 ruby source -l 切换ruby的源...

  • CI 钩子函数的使用

    点击查看官方钩子基本说明 手动调用钩子 修改配置启用钩子 在 application/config/hooks.p...

网友评论

      本文标题:ruby钩子

      本文链接:https://www.haomeiwen.com/subject/tkxqtttx.html