33

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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Marian Theisen
  • 6,100
  • 29
  • 39

5 Answers5

83

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.

Marc-André Lafortune
  • 78,216
  • 16
  • 166
  • 166
10

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'
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Andrew Grimm
  • 78,473
  • 57
  • 200
  • 338
  • The StringIO.new trick gets my +1 because it doesn't seem to open a file descriptor, so perhaps doesn't require explicit closing: http://stackoverflow.com/questions/4795447/rubys-file-open-and-the-need-for-f-close – Martin Dorey May 08 '12 at 23:45
  • 2
    It doesn't trash input though, so has the potential to cause a memory leak depending on your use case. – Xavier Shay Nov 22 '16 at 23:57
5

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.

Peter O.
  • 32,158
  • 14
  • 82
  • 96
  • 1
    That needs to be `def <<(o); self end` to work properly (otherwise `null_stream << foo << bar` will break). – sepp2k Dec 30 '11 at 17:08
  • This nullifies output only on application or user level (virtual or fake streams, string IOs, etc.), not on system level (real streams, fd, device files, etc.). [Marc-André Lafortune's answer](http://stackoverflow.com/a/8682009/445221) is probably more appropriate. – konsolebox Sep 06 '14 at 06:42
2

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

Dende
  • 545
  • 6
  • 19
1

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.

Andrew Grimm
  • 78,473
  • 57
  • 200
  • 338