2011-12-30 8 views
24

ho potuto utilizzare:C'è qualcosa come uno stream null in Ruby?

File.open('/dev/null', 'w') 

su sistemi Unix, ma se c'è un modo di Ruby per raggiungere questo obiettivo, mi piacerebbe usarlo. Sto solo cercando un flusso IO, che "cancella" immediatamente tutte le scritture, un po 'come un oggetto nullo.

+1

Se non ce ne è già uno, sarebbe follemente facile crearne uno. Basta avere una lezione con metodi di scrittura che non facciano nulla. – cHao

+0

Questo dovrebbe funzionare bene su Windows, Linux e Mac OS. –

+1

appena trovato questo gist https://gist.github.com/369632 – maprihoda

risposta

5

No, non credo ci sia nulla di simile a un flusso null in Ruby, almeno nelle versioni precedenti. In tal caso, devi crearne uno tu stesso. A seconda dei metodi che sarà chiamata, sarà necessario scrivere metodi stub sulla classe di flusso nullo, in questo modo:

class NullStream 
    def <<(o); self; end 
end 

L'esempio di cui sopra non è affatto completo. Ad esempio, alcuni flussi potrebbero richiedere la chiamata di write, puts o altri metodi. Inoltre, alcuni metodi dovrebbero essere implementati restituendo self nei loro metodi, come <<, altri no.

+1

Che deve essere 'def << (o); self end' per funzionare correttamente (altrimenti 'null_stream << foo << bar' si romperà). – sepp2k

+1

Funzionerà solo se si esegue l'override di 'puts',' print', 'write', ecc ... – Linuxios

+1

Perché ho votato down? –

68

Se si desidera che il comportamento pieno di corsi d'acqua, la migliore è probabilmente quello di usare:

File.open(File::NULL, "w") 

Nota che File::NULL è nuovo a Ruby 1.9.3; è possibile utilizzare il mio backports gemma:

require 'backports/1.9.3/file/null' # => Won't do anything in 1.9.3+ 
File.open(File::NULL, "w")   # => works even in Ruby 1.8.6 

Si potrebbe anche copiare il relevant code, se si preferisce.

+0

grazie per aver detto che –

+3

+1 Questo ha bisogno di upvoting! – d11wtq

+0

È eccellente. Ecco come lo uso: 'STDNULL = File.open (File :: NULL, 'w') 'poi uso STDNULL ogni dove –

7

C'è StringIO, che trovo utile quando voglio introdurre un filestream dummy:

require "stringio" 
f = StringIO.new 
f.gets # => nil 

ed ecco qualche codice da heckle che trova il secchio bit per Unix e Windows, leggermente modificato:

# Is this platform MS Windows-like? 
# Actually, I suspect the following line is not very reliable. 
WINDOWS = RUBY_PLATFORM =~ /mswin/ 
# Path to the bit bucket. 
NULL_PATH = WINDOWS ? 'NUL:' : '/dev/null' 
+0

The StringIO.new trucco ottiene il mio +1 perché non sembra aprire un descrittore di file, quindi forse non richiede chiusura esplicita: http : //stackoverflow.com/questions/4795447/rubys-file-open-and-the-need-for-f-close –

+2

Non trasporta l'input, quindi ha il potenziale per causare una perdita di memoria a seconda del vostro uso Astuccio. –

1

C'è una gemma chiamata devnull

implementazione di Ruby di file di nulla (come/dev/n ull su Un * x, NUL sul di Windows)

non interagisce con il file nulla, ma invece ha metodi fittizi per tutti i metodi che IO oggetti implementare.

Problemi correlati