我正在为我的项目开发一个外壳。我希望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
完全像我发现的那样。