如何在包含中的类中包含重新定义的方法

暴风雨

我写了这个模块:

module Hooks
  module ExecutionHooks
    def before_action(hook, *method_names)
      method_names.each do |method_name|
        method = method(method_name)
        define_singleton_method(method_name) do |*args, &block|
          method(hook).call(*args)
          method.call(*args, &block)
        end
      end
    end
  end

  def self.included(base)
    base.send(:extend, Hooks::ExecutionHooks)
  end
end

该模块允许其他模块或类定义一个挂钩,在类似于before_actionin Rails的特定操作之前应调用该挂钩然后,我将此模块包含在HTTParty模块中:

module HTTParty
  include Hooks
  before_action :perform_action, :get

  def self.perform_action
    puts "performed"
  end
end

有一个包含HTTParty模块的类:

class TestClient 
  include HTTParty
  ...
end

当我尝试访问getTestClient中方法时,它不会调用perform_actionget这里包含方法是原始方法,而不是重新定义的方法。

有没有办法get在TestClient类中包含重新定义的方法?

克里斯蒂安

您的代码几乎可以正常运行,但get实际上HTTParty并没有直接在上定义,这是您所没有想到的,并且HTTPartyincludedclass方法get通过另一条路径添加到您的类中。

HTTParty有一个名为HTTParty::ClassMethodscontains的模块get,等等。它将它们放在两个位置:在HTTParty其本身上,您可以调用HTTParty.get,在任何类上include HTTParty,都可以通过included钩子进行调用打开module HTTParty和时include Hooks,插入了钩子HTTParty.get,这与调用时不同TestClient.get不理会您的Hooks::ExecutionHooks模块,建议您制作一个HookedHTTParty模块,而不是monkeypatching HTTParty这样可以更清楚地说明发生了什么,并避免了HTTParty内部的复杂性,我们不应该去摆弄这些复杂性

# hooked_httparty.rb
require 'httparty'
require 'hooks'

module HookedHTTParty
  module ClassMethods
    def global_perform(*args)
      puts "Running global perform with args #{args.inspect}"
    end
  end

  def self.included(base)
    base.include(HTTParty)
    base.include(Hooks)
    base.extend(HookedHTTParty::ClassMethods)
    base.before_action :global_perform, :get
  end
end

这样可以保证HTTPartyHooks可用base,然后global_perform在每个get与您的初始代码的主要区别在于,它是before_actionbaseTestClient)而不是on上调用HTTParty,因此我们可以找到正确的get方法。您还会注意到global_performaccepts *args,因为在生成钩子时是以这种方式调用它的。

因为我们有Hooks,你现在还可以使用before_actionTestClient本身,所以你也可以定义更具体的before_actionS:

class TestClient
  include HookedHTTParty

  before_action :local_perform, :get

  def self.local_perform(*args)
    puts "Running local perform with args #{args.inspect}"
  end
end

运行get看起来像这样:

> TestClient.get 'https://www.stackoverflow.com'
Running local perform with args ["https://www.stackoverflow.com"]
Running global perform with args ["https://www.stackoverflow.com"]
 => #<HTTParty::Response:0x7fa523a009e0 ... >

如果确实需要进行任何操作HTTParty(也许是因为您无法控制包括该操作的东西),则可能需要HTTParty::ClassMethods直接进行monkeypatch ,因为这get是定义的瓶颈,但进入了更黑暗的领域。只要您在周围注入代码,还OtherThing.include(HookedHTTParty)可以使其更加显式并使其更加封装。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++将派生类存储在单个向量中,而派生类不包含重新定义的方法

来自分类Dev

如何在C ++中重新定义类对象

来自分类Dev

重新定义段落范围以在段落中包含单词的子集

来自分类Dev

C2011:“卡”:“类”类型的重新定义(尽管使用了包含保护,但未在.cpp文件中重新定义类)

来自分类Dev

如何在特定应用中重新定义框架常量?

来自分类Dev

如何在SBT中重新定义密钥?

来自分类Dev

C#在子类中重新定义子方法而不在父类中重新定义调用方法

来自分类Dev

如何在javascript中重新定义私有方法?

来自分类Dev

重新定义函数,同时在C ++中包含文件(错误LNK2005)

来自分类Dev

重新定义本地liquibase属性,这些属性在包含的文件中仍然可见

来自分类Dev

如何在类中包含函数属性?

来自分类Dev

如何在distZip中包含测试类?

来自分类Dev

如何在VBA中包含.NET类?

来自分类Dev

如何从包含的php类中调用方法?

来自分类Dev

重新定义派生类中的静态成员。爪哇

来自分类Dev

在继承的类中重新定义常量成员变量

来自分类Dev

C ++中的错误:重新定义类构造函数

来自分类Dev

在继承的类中重新定义常量成员变量

来自分类Dev

cpp文件中的类类型重新定义

来自分类Dev

C#重新定义类中的变量

来自分类Dev

Ruby动态重新定义include中不存在的类方法

来自分类Dev

如何在C中重新定义字符指针中的内容

来自分类Dev

如何在类中包含定义常量的文件(及其作用域)

来自分类Dev

如何在Android Studio中重新包含排除的目录?

来自分类Dev

如何在Android Studio中重新包含排除的目录?

来自分类Dev

main()方法中包含的类

来自分类Dev

从重新定义的方法中调用原始方法

来自分类Dev

从重新定义的方法中调用原始方法

来自分类Dev

如何在Objective-C中禁止显示“宏重新定义”警告

Related 相关文章

  1. 1

    C ++将派生类存储在单个向量中,而派生类不包含重新定义的方法

  2. 2

    如何在C ++中重新定义类对象

  3. 3

    重新定义段落范围以在段落中包含单词的子集

  4. 4

    C2011:“卡”:“类”类型的重新定义(尽管使用了包含保护,但未在.cpp文件中重新定义类)

  5. 5

    如何在特定应用中重新定义框架常量?

  6. 6

    如何在SBT中重新定义密钥?

  7. 7

    C#在子类中重新定义子方法而不在父类中重新定义调用方法

  8. 8

    如何在javascript中重新定义私有方法?

  9. 9

    重新定义函数,同时在C ++中包含文件(错误LNK2005)

  10. 10

    重新定义本地liquibase属性,这些属性在包含的文件中仍然可见

  11. 11

    如何在类中包含函数属性?

  12. 12

    如何在distZip中包含测试类?

  13. 13

    如何在VBA中包含.NET类?

  14. 14

    如何从包含的php类中调用方法?

  15. 15

    重新定义派生类中的静态成员。爪哇

  16. 16

    在继承的类中重新定义常量成员变量

  17. 17

    C ++中的错误:重新定义类构造函数

  18. 18

    在继承的类中重新定义常量成员变量

  19. 19

    cpp文件中的类类型重新定义

  20. 20

    C#重新定义类中的变量

  21. 21

    Ruby动态重新定义include中不存在的类方法

  22. 22

    如何在C中重新定义字符指针中的内容

  23. 23

    如何在类中包含定义常量的文件(及其作用域)

  24. 24

    如何在Android Studio中重新包含排除的目录?

  25. 25

    如何在Android Studio中重新包含排除的目录?

  26. 26

    main()方法中包含的类

  27. 27

    从重新定义的方法中调用原始方法

  28. 28

    从重新定义的方法中调用原始方法

  29. 29

    如何在Objective-C中禁止显示“宏重新定义”警告

热门标签

归档