Невозможно изнутри Единства. Вы должны иметь некоторый внешний сторожевой процесс
Я подозреваю, что что-то упустил, но предположим, что это не так ...
Почему создание подклассов не является вариантом? Не могли бы вы просто переопределить те части ввода-вывода, которые должны вести себя по-другому?
class MyIO < IO
# your modified methods go here. e.g.
def some_io_method(args)
do_some_preprocessing
super(args)
do_some_post_processing
end
end
Если вы не можете заменить свой подкласс домашнего приготовления, как насчет изменения самого ввода-вывода ("исправление обезьяны") примерно таким:
class IO
alias_method :original_some_io_method, :some_io_method
def some_io_method(args)
do_some_preprocessing
original_some_io_method(args)
do_some_post_processing
end
end
Я успешно использовал следующий прием, чтобы сделать StringIO «настоящим» вводом-выводом:
# make mechanize believe our address xml actually is an IO so it will be uploaded as a file:
address_io = StringIO.new(address_xml)
class << address_io
alias is_a_old is_a?
def is_a?(stuff)
stuff == IO || is_a_old(stuff)
end
def path
'address.xml'
end
end