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
相关产品推荐
相关产品推荐

