ruby-on-rails - Ruby Prepend Module - 如何将模块添加到父类的祖先数组的开头

标签 ruby-on-rails ruby

我有这样的代码:

module ModuleToPrepend
  def perform(*args)
    puts args
    super
  end
end

class Base
  prepend ModuleToPrepend
end

class Child < Base
  def perform(*args)
    do_something(args)
  end
end

我正在寻找一种在每次 Child.new.perform 调用之前打印方法参数的解决方案。我想将模块 ModuleToPrepend 添加到类 Base 内祖先列表的开头。我不想将其添加到 Child 类中,因为它们有数百个。

我的代码返回:Child.ancestrors #=> [Child, ModuleToPrepend, Base] 我想要这个: Child.ancestrors #=> [ModuleToPrepend, Child, Base]

可以用 ruby​​ 完成吗?

最佳答案

不确定这是否有任何副作用(如果有的话,请赐教),但以下应该有效:

module ModuleToPrepend
  def perform(*args)
    puts 'ModuleToPrepend#perform'
    puts args
    super
  end
end

class Base
  def self.inherited(subclass)
    puts 'Base.inherited'
    subclass.prepend(ModuleToPrepend) if subclass.superclass == Base
    super
  end
end

class Child < Base
  def perform(*args)
    puts 'Child#perform'
  end
end
# => Base.inherited

class Subchild < Child
  def perform(*args)
    puts 'Subchild#perform'
    super
  end
end
# => Base.inherited

puts Child.ancestors
# => [ModuleToPrepend, Child, Base, Object, Kernel, BasicObject]

child = Child.new
child.perform('arg1', 'arg2')
# => ModuleToPrepend#perform
# => [arg1, arg2]
# => Child#perform

puts Subchild.ancestors
# => [Subchild, ModuleToPrepend, Child, Base, Object, Kernel, BasicObject]

subchild = Subchild.new
subchild.perform('arg1', 'arg2')
# => Subchild#perform
# => ModuleToPrepend#perform
# => [arg1, arg2]
# => Child#perform

关于ruby-on-rails - Ruby Prepend Module - 如何将模块添加到父类的祖先数组的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49897647/

相关文章:

ruby-on-rails - 在关联模型中搜索适当的搜索过滤器

ruby-on-rails - 将 ID/Class 添加到 Rails link_to 的更简洁的方法?

ruby - 'new' 的公共(public)类方法 'Class' 的位置

ruby-on-rails - Rails/Pundit 参数错误

ruby-on-rails - 为什么安装 Ruby on Rails 会产生错误 "size of array ' ruby​​_check_sizeof_voidp' is negative”?

ruby-on-rails - Rails - 根据 API 版本向响应添加自定义 header

ruby-on-rails - 如何更新通过 git 但在 svn 仓库中安装的 rails 插件?

javascript - 选择所有复选框...使用 javascript 和 rails

ruby-on-rails - 任何调试 RSpec 请求规范的方法?

ruby-on-rails - Spring 警告 : You're using Rubygems 2. 0.3。至少升级到 Rubygems 2.1.0