加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:09:35 所属栏目:百科 来源:网络整理
导读:在 Ruby中,我想让一个类包含一系列模块,并让这些单独的模块在初始化该类时执行一个块或方法(或者只是找到一些编辑实例变量的方法).我知道我可以通过在模块中创建一个方法然后在类的initialize方法中调用它来实现这一点,但是我想通过简单地包含模块并调用一个
在 Ruby中,我想让一个类包含一系列模块,并让这些单独的模块在初始化该类时执行一个块或方法(或者只是找到一些编辑实例变量的方法).我知道我可以通过在模块中创建一个方法然后在类的initialize方法中调用它来实现这一点,但是我想通过简单地包含模块并调用一个方法来执行模块添加到初始化的任何代码来实现这一点.这样我就可以在类中包含大量的东西,而不必担心在包含的每个模块的initialize方法中添加一行代码.我已经检查了别名,超级和相关的东西,但没有得到任何东西……如果它有助于理解我希望在这里完成的一些伪代码:
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,3,4,5]

这可能有点罗嗦,但我认为标题总结了我正在努力做的事情.谢谢你的帮助!

解决方法

有几种方法可以做到这一点.此示例将重新定义initialize方法并添加您想要的任何额外代码:
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,3]    
  end  

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读