将' STDOUT '和' STDIN '组合成一个' IO '对象



是否有办法创建单个IO对象,其读流是当前进程的STDOUT,其写流是当前进程的STDIN ?

这类似于IO.popen,它将命令作为子进程运行,并返回连接到子进程标准流的IO对象。但是,我不想运行子进程,我想使用当前的Ruby进程。

是否有办法创建单个IO对象

。STDIN和STDOUT是两个不同的文件描述符。一个IO代表一个FD。

但是,您可以创建一些像IO对象一样的东西。这可能包含一堆错误,因为复制fd通常是不好的。
require "forwardable"
class IOTee < IO
  extend Forwardable
  def_delegators :@in, 
    :close_read, 
    :read, 
    :read_nonblock, 
    :readchar, 
    :readlines, 
    :readpartial, 
    :sysread
  def_delegators :@out, 
    :close_write,
    :syswrite, 
    :write, 
    :write_nonblock
  def initialize(input,output)
    @in = input
    @out = output
  end
end
io = IOTee.new(STDIN,STDOUT) # You would swap these
io.puts("hi")
hi
=> nil

这取决于你在做什么,这里有IO#pipeIO#reopen也可能有帮助。

http://ruby-doc.org/core-2.1.0/IO.html method-i-reopen

http://ruby-doc.org/core-2.1.0/IO.html method-c-pipe

我怀疑以上并不是你真正想要解决的问题,而是你在解决问题的过程中遇到的问题。

我怀疑真的做了一个管道,重新打开STDOUTSTDIN的任何一端是你真正想要的。将它们组合在一个IO对象中没有多大意义。

另外,如果您通过STDINSTDOUT与自己对话,那么在等待自己读取或写入数据时很容易达到死锁。

最新更新