2015-10-11 1 views
3

Есть ли способ создать единственный объект IO, чей поток чтения является текущим процессом STDOUT и чей поток записи является текущим процессом STDIN?Объединить `STDOUT` и` STDIN` в один объект `IO`

Это похоже на IO.popen, который выполняет команду в качестве подпроцесса и возвращает объект IO, подключенный к стандартным потокам подпроцессов. Однако я не хочу запускать подпроцесс, я хочу использовать текущий процесс Ruby.

ответ

1

Есть ли способ, чтобы создать единый объект 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, было бы очень легко добраться до тупика, пока вы будете сами ждать, чтобы читать или писать данные.

+0

Да, я в основном заканчивал открытие каждого конца трубы, как вы предлагали. Наверное, я просто смущен тем, что «IO.popen» может подключать стандартные потоки подпроцесса к одному файловому дескриптору, но то же самое не может быть сделано с основным процессом. – rickyrickyrice