如何在Ruby中创建IO的自定义子类?

jed*_*iah 9 ruby

如何创建我自己的可替代IO的类,以便为某些接受IO类参数的代码重定向/捕获输入/输出?IO本身似乎与OS文件描述符耦合,我所知道的唯一一个模仿它的类没有子类化它是StringIO,它似乎只是重新实现了整个接口.

我认为该语言将提供一种直接的方式来做到这一点,但我找不到有关该主题的任何信息.是否有一个mixin在几个原语之上实现接口,就像Enumerable一样?

Mik*_*use 4

我怀疑我错过了一些东西,但假设情况并非如此......

为什么子类化不是一种选择?难道你不能直接覆盖 IO 中需要表现不同的部分吗?

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
Run Code Online (Sandbox Code Playgroud)

如果你不能替换你的自制子类,那么修改 IO 本身(“猴子修补”)怎么样:

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
Run Code Online (Sandbox Code Playgroud)

  • 问题在于,有无数的方法可以读取/写入数据,并且重新实现它们非常繁琐。Enumerable 显式地根据#each 实现了所有内容,因此通过覆盖#each,您可以“免费”获得其他所有内容。我不明白为什么 IO 不以同样的方式工作,也不明白为什么我现在编写的用于完成此任务的 mixin 还不存在。另一个奇怪的事情是 IO 是如此专业,具有像 sys* 这样的方法,不属于其他实现。这可以解决,但并不理想。 (4认同)