在Ruby中有类似null流的东西吗?

Mar*_*sen 27 ruby stream

我可以用:

File.open('/dev/null', 'w')
Run Code Online (Sandbox Code Playgroud)

在Unix系统上,但如果有一种Ruby方法来实现这一点,我想使用它.只是寻找一个IO流,立即"破坏"所有写入,有点像一个空对象.

Mar*_*une 74

如果你想要流的完整行为,最好的可能是使用:

File.open(File::NULL, "w")
Run Code Online (Sandbox Code Playgroud)

请注意,这File::NULL是Ruby 1.9.3的新功能; 你可以使用我的backports宝石:

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
Run Code Online (Sandbox Code Playgroud)

如果您愿意,也可以复制相关代码.


And*_*imm 8

有stringIO,当我想引入虚拟文件流时,我发现它很有用:

require "stringio"
f = StringIO.new
f.gets # => nil
Run Code Online (Sandbox Code Playgroud)

这里有一些来自heckle的代码,它找到了unix和windows的位桶,稍加修改:

# 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'
Run Code Online (Sandbox Code Playgroud)

  • 它不会丢弃输入,因此根据您的使用情况,可能会导致内存泄漏. (2认同)

Pet*_* O. 5

不,我不相信Ruby中有任何类似于null的流,至少在早期版本中是这样.在这种情况下,你必须自己制作一个.根据它将调用的方法,您需要在null流类上编写存根方法,如下所示:

class NullStream
   def <<(o); self; end
end
Run Code Online (Sandbox Code Playgroud)

上面的例子绝不是完整的.例如,一些流可能需要调用write,puts或其它方法.此外,一些方法应该通过返回self他们的方法来实现,比如<<,其他方法不是.