Ruby:通过模块添加东西来初始化方法

标签 ruby module initialization

在 Ruby 中,我想让一个类包含一系列模块,并让这些单独的模块在初始化该类时执行一个 block 或方法(或者只是想办法编辑一个实例变量)。

我知道我可以通过在模块中创建一个方法然后在类的初始化方法中调用它来做到这一点,但我想通过简单地包含模块并调用一个方法来执行模块中的任何代码来实现这一点添加到初始化,这样我就可以在类中包含大量内容,而不必担心在初始化方法中为包含的每个模块添加一行代码。

我检查了别名、 super 和相关的东西,但没有得到任何东西......

如果它有助于理解我希望完成的是一些伪代码:

module Mod1  
    call_this_block_on_initialize { @a.push 4 }  
end  
  
module Mod2  
    call_this_block_on_initialize { @a.push 5 }  
end  
  
class Test  
    attr_accessor :a  
    include Mod1  
    include Mod2  
  
    def initialize  
      @a = [1, 2, 3]  
      call_those_blocks_set_by_mods  
    end  
end  

t = Test.new
t.a # returns [1, 2, 3, 4, 5]

这可能有点罗嗦,但我认为标题总结了我正在尝试做的事情。感谢您的帮助!

最佳答案

有几种方法可以做到这一点。此示例将重新定义初始化方法并添加您想要的任何额外代码:

module MyModule
  def self.included(base) # built-in Ruby hook for modules
    base.class_eval do    
      original_method = instance_method(:initialize)
      define_method(:initialize) do |*args, &block|
        original_method.bind(self).call(*args, &block)
        @a.push 4 # (your module code here)
      end
    end
  end
end

class Test  
  attr_accessor :a  

  def initialize  
    @a = [1, 2, 3]    
  end  

  # It must be included after the `initialize` 
  # definition or the module won't find the method:
  include MyModule
end  

但是: 我认为你真正想要的是子类化。如果你有很多具有相似行为的类,就像你看起来那样,问问自己是否有一个自然的抽象父类。你能解释一下你用 super 做了什么以及为什么它不起作用吗?

关于Ruby:通过模块添加东西来初始化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13257919/

相关文章:

ruby-on-rails - Rails 设计在有 STI 时向注册表添加字段

ruby - 在初始化时使用 attr_accessor 设置 ruby​​ 2.0 关键字参数

python - 导入 Python 模块时 __package__ 为 None

mysql - 保存在 MySQL 数据库中的 JSON 或 XML 或序列化数组

ruby - 在 Ruby 中尽早转义 .each { } 迭代

Python导入模块: what is different between a file and a directory?

python - 在Python模块中运行无限while循环

ios - 自定义 UIView 初始化程序的便利初始化程序必须使用 self.init 错误进行委托(delegate)

delphi - 变量可能尚未初始化。我可以为字符串打开此警告吗?

java - 在 Java 中用一组特定的数据干净地初始化字典