【问题标题】:Is there something like a null-stream in Ruby?Ruby中有没有类似空流的东西?
【发布时间】:2012-01-30 16:45:35
【问题描述】:

我可以使用:

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

在 Unix 系统上,但如果有 Ruby 方法来实现这一点,我想使用它。我只是在寻找一个 I/O 流,它会立即“丢弃”所有写入,有点像空对象。

【问题讨论】:

  • 如果还没有,制作一个会非常容易。只需要一个类,其中的 write 方法什么都不做。
  • 这应该可以在 Windows、Linux 和 Mac OS 上正常运行。
  • 刚刚发现这个要点gist.github.com/369632
  • @tinman 确定吗?
  • 感谢@maprihoda,这可能很有用。

标签: ruby stream


【解决方案1】:

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

【讨论】:

  • StringIO.new 技巧得到了我的 +1,因为它似乎没有打开文件描述符,所以可能不需要显式关闭:stackoverflow.com/questions/4795447/…
  • 它不会丢弃输入,因此根据您的使用情况可能会导致内存泄漏。
【解决方案2】:

Logger.new("/dev/null") 成功了

【讨论】:

    【解决方案3】:

    有一个宝石叫devnull

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

    它不与空文件交互,而是为 IO 对象实现的所有方法提供虚拟方法。

    【讨论】:

      【解决方案4】:

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

      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

      【讨论】:

      • 那太好了。我就是这样使用它的:STDNULL = File.open(File::NULL, 'w') 然后我在每个地方都使用 STDNULL
      【解决方案5】:

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

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

      上面的例子并不完整。例如,某些流可能需要调用writeputs 或其他方法。此外,有些方法应该通过在其方法中返回self来实现,例如&lt;&lt;,而其他方法则不需要。

      【讨论】:

      • 这需要def &lt;&lt;(o); self end 才能正常工作(否则null_stream &lt;&lt; foo &lt;&lt; bar 会中断)。
      • 这只会使应用程序或用户级别(虚拟或假流、字符串 IO 等)的输出无效,而不是系统级别(真实流、fd、设备文件等)的输出。 Marc-André Lafortune's answer 可能更合适。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多