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

时间:2011-12-30 16:54:35

标签: ruby stream

我可以使用:

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

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

5 个答案:

答案 0 :(得分:70)

如果您想要流的完整行为,最好使用:

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

请注意File::NULL是Ruby 1.9.3的新功能;你可以使用我的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

如果您愿意,也可以复制relevant code

答案 1 :(得分:7)

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

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

这里有一些来自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'

答案 2 :(得分:5)

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

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

以上示例并非完整。例如,某些流可能需要调用writeputs或其他方法。此外,应该通过在self方法中返回<<来实现某些方法,而不是其他方法。

答案 3 :(得分:1)

有一个名为devnull

的宝石
  

Ruby文件的Ruby实现(如Un * x上的/ dev / null,NUL on   视窗)

它不与null文件交互,而是为IO对象实现的所有方法都有伪方法。

答案 4 :(得分:1)

Logger.new("/dev/null")可以解决问题