You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中重写initialize方法后,如何调用原方法输出'init'

问题解决:Ruby重写类初始化方法保留原有逻辑

当你重新打开Ruby类并定义同名方法时,新方法会完全覆盖旧方法,而非重载。你代码里的super调用的是父类(Object)的空initialize方法,而非原来输出init的那个,所以看不到预期的init输出。

要保留puts 'init'的逻辑同时修改@nazwa,可以用alias_method保存旧的初始化方法,再在新方法中调用它:

修改后的代码

class Dwa
  attr_reader :nazwa

  def initialize()
    puts 'init'
    @nazwa = "dwa"
  end
end

class Dwa #重新打开同一个类定义
  # 保存原initialize方法为original_initialize
  alias_method :original_initialize, :initialize

  def initialize()
    original_initialize # 执行原逻辑输出'init'
    @nazwa = "trzy"      # 覆盖属性值
  end
end

d = Dwa.new
puts "#{d.nazwa}"

运行结果

init
trzy

另一种更清晰的写法(提前抽离公共逻辑)

如果一开始就考虑到后续可能重写初始化逻辑,可以把公共操作抽成私有方法:

class Dwa
  attr_reader :nazwa

  def initialize()
    setup_basic
    @nazwa = "dwa"
  end

  private

  def setup_basic
    puts 'init'
  end
end

class Dwa
  def initialize()
    setup_basic
    @nazwa = "trzy"
  end
end

内容的提问来源于stack exchange,提问作者0x3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:50:00