Есть ли способ, чтобы создать единый объект IO
No. STDIN и STDOUT два различных файловых дескрипторов. IO представляет собой один FD.
Вы можете, однако, сделать что-то, что действует как объект ввода-вывода. Это, вероятно, содержит кучу ошибок, поскольку дублирование 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
с обоих концов - это то, что вы действительно после. Объединение их в один объект ввода-вывода не имеет большого смысла.
Кроме того, если вы разговаривали сами с собой через STDIN
и STDOUT
, было бы очень легко добраться до тупика, пока вы будете сами ждать, чтобы читать или писать данные.
Да, я в основном заканчивал открытие каждого конца трубы, как вы предлагали. Наверное, я просто смущен тем, что «IO.popen» может подключать стандартные потоки подпроцесса к одному файловому дескриптору, но то же самое не может быть сделано с основным процессом. – rickyrickyrice