Marian Theisen
Marian Theisen

Reputation: 6353

Is there something like a null-stream in Ruby?

I could use:

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

on Unix systems, but if there is a Ruby way to achieve this, I'd like to use it. I am just looking for an I/O stream, that immediately "trashes" all writes, kind of like a null-object.

Upvotes: 33

Views: 7502

Answers (5)

Andrew Grimm
Andrew Grimm

Reputation: 81540

There's stringIO, which I find useful when I want to introduce a dummy filestream:

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

And here's some code from heckle that finds the bit bucket for both Unix and Windows, slightly modified:

# 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'

Upvotes: 11

Dende
Dende

Reputation: 584

Logger.new("/dev/null") does the trick

Upvotes: 2

Andrew Grimm
Andrew Grimm

Reputation: 81540

There's a gem called devnull

Ruby implementation of null file (like /dev/null on Un*x, NUL on Windows)

It doesn't interact with the null file, but instead has dummy methods for all the methods that IO objects implement.

Upvotes: 1

Marc-André Lafortune
Marc-André Lafortune

Reputation: 79562

If you want the full behavior of streams, the best is probably to use:

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

Note that File::NULL is new to Ruby 1.9.3; you can use my backports gem:

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

You could also copy the relevant code if you prefer.

Upvotes: 84

Peter O.
Peter O.

Reputation: 32878

No, I don't believe there is anything like a null stream in Ruby, at least in earlier versions. In that case, you must make one yourself. Depending on the methods that it will call, you will need to write stub methods on the null stream class, like this:

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

The above example is by no means complete. For example, some streams may require calling the write, puts or other methods. Moreover, some methods should be implemented by returning self in their methods, like <<, others not.

Upvotes: 5

Related Questions