是否有办法创建单个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#pipe
和IO#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
我怀疑以上并不是你真正想要解决的问题,而是你在解决问题的过程中遇到的问题。
我怀疑真的做了一个管道,重新打开STDOUT
和STDIN
的任何一端是你真正想要的。将它们组合在一个IO对象中没有多大意义。
另外,如果您通过STDIN
和STDOUT
与自己对话,那么在等待自己读取或写入数据时很容易达到死锁。