2013-03-13 6 views
13

Sto lavorando con un oggetto IO (un po 'di testo di output STDOUT) e sto provando a convertirlo in una stringa in modo da poter eseguire un po' di elaborazione del testo. Mi piacerebbe fare qualcosa di simile:Come posso convertire un oggetto IO in una stringa in Ruby?

my_io_object = $stdout 
#=> #<IO:<STDOUT>> 

my_io_object.puts('hi') #note: I know how to make 'hi' into a string, but this is a simplified example 
#=>hi 

my_io_object.to_s 

ho provato un paio di cose e ottenuto alcuni errori:

my_io_object.read 
#=> IOError: not opened for reading 

my_io_object.open 
#=> NoMethodError: private method `open' called for #<IO:<STDOUT>> 

IO.read(my_io_object) 
#=> TypeError: can't convert IO into String 

che ho letto attraverso i metodi della classe IO, e non posso capire come manipolare i dati in quell'oggetto. Eventuali suggerimenti?

+0

"IOError: non aperto per la lettura" dovrebbe essere un indizio appropriata. Prova a cercare il suddetto errore. –

+0

Non hai detto chiaramente cosa stai cercando di fare. Spiega cosa vuoi fare e probabilmente possiamo darti un modo migliore per arrivarci. Come stai ottenendo il tuo testo STDOUT? –

+0

Grazie, @theTinMan. Mi scuso per la mancanza di chiarezza - è un riflesso della mia confusione. Ho finito per risolvere questo indirizzando STDOUT a un oggetto StringIO. – MothOnMars

risposta

21

Ho risolto questo indirizzando la mia uscita a un oggetto StringIO invece di STDOUT:

> output = StringIO.new 
#<StringIO:0x007fcb28629030> 
> output.puts('hi') 
nil 
> output.string 
"hi\n" 
-1

STDOUT accetta stringhe, non fornisce stringhe. Puoi scriverci, ma non puoi leggerlo.

STDOUT.write("hello") # => hello 
STDOUT.read # => IOError: not opened for reading 
+0

Hmm. Quindi è la mia unica opzione per indirizzare l'output su un file, quindi leggere dal file per ottenere l'oggetto stringa? – MothOnMars

+0

Cosa stai cercando di fare? –

+1

Questa è una domanda molto interessante, poiché STDOUT è generalmente un file, sebbene un tipo speciale di file. Ecco la documentazione [tee gem] (http://rubydoc.info/gems/tee/1.0.0/frames). Questo potrebbe essere ciò che stai cercando, per quanto riguarda il comportamento. – vgoff

Problemi correlati