Как Вы создаете пользовательский подкласс IO в Ruby?

Невозможно изнутри Единства. Вы должны иметь некоторый внешний сторожевой процесс

9
задан jedediah 9 May 2009 в 23:41
поделиться

2 ответа

Я подозреваю, что что-то упустил, но предположим, что это не так ...

Почему создание подклассов не является вариантом? Не могли бы вы просто переопределить те части ввода-вывода, которые должны вести себя по-другому?

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
4
ответ дан 3 November 2019 в 07:14
поделиться

Я успешно использовал следующий прием, чтобы сделать 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
1
ответ дан 3 November 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: