我正在爲我的項目工作。我想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>
我認爲打印,並把我上面寫的塊會留在這個範圍內,而不是在執行其有史以來發生的範圍從調用。是否有可能解決這個問題?
獎金的問題:我如何把原來的打印功能恢復?我本來計劃這個:
Kernel.module_exec {
define_method(:print, &master_print)
define_method(:puts, &master_puts)
undef_method(:puts_padded)
}
但我還沒有嘗試過,我不知道這是否會離開Kernel
正是因爲我發現它。
我明白了!這清除了一些事情。 – Hubro