【发布时间】:2013-07-01 06:32:26
【问题描述】:
我正在为我的项目开发一个外壳。我希望 Shell 类在 shell 运行时覆盖所有打印功能,所以我这样做了:
# WARNING: Blocks until the user exits.
def start
# Override Kernel print functions.
master_print = Kernel.method :print
master_puts = Kernel.method :puts
Kernel.module_exec {
define_method(:print) { |text = ""|
self.send(:print_override, master_print, text)
}
define_method(:puts) { |text = ""|
self.send(:puts_override, master_puts, text)
}
define_method(:puts_padded) { |text = ""|
self.send(:puts_override, master_puts, "")
self.send(:puts_override, master_puts, text)
self.send(:puts_override, master_puts, "")
}
}
# Readline loop and command parsing here...
end
只要只有Shell 类输出任何文本,这就会很好地工作,但只要命令类尝试puts,我就会明白:
NoMethodError: undefined method `puts_override' for #<AddressKit::CLI::Interactiv
e::Commands::LoadTable:0x000000027735b0>
我认为我上面写的 print 和 puts 块会留在这个范围内,而不是在它们碰巧被调用的范围内执行。有办法解决吗?
额外问题:我如何把原来的打印功能放回去?我已经计划好了:
Kernel.module_exec {
define_method(:print, &master_print)
define_method(:puts, &master_puts)
undef_method(:puts_padded)
}
但我还没有尝试过,我不知道这是否会让Kernel 与我找到的完全一样。
【问题讨论】: