如何在ruby中将输出打印到stdout时使用回调

时间:2011-10-22 14:03:40

标签: javascript ruby node.js spawn

我正在编写用于监视服务器状态的脚本。 我可以用javascript编写代码,但我必须用ruby编写它。

在javascript中,可以使用像这样的node.js来完成。

var iostat = require('child_process').spawn("iostat", ["-w 1"]);
iostat.stdout.on('data', function (data) {
    console.log(data);
});

此代码每秒执行iostat命令并输出到控制台。 我如何在ruby中实现相同的功能? 换句话说,我想在styout打印在ruby中时使用回调。

1 个答案:

答案 0 :(得分:1)

可能有更好的方法可以做到这一点,但你可以这样做:

module PutsWatcher
  def puts(string)
    super("***#{string}***")
  end
end

$stdout.extend PutsWatcher

puts "here"
# => "***here***"

如果你在IRB或Pry中这样做会有点奇怪,因为它们会自己产生输出(即你nil之后的puts),但是这里是副本/从pry粘贴:

pry(main)> module PutsWatcher
pry(main)*   def puts(string)
pry(main)*     super("***#{string}***")
pry(main)*   end
pry(main)* end
=> nil
pry(main)> $stdout.extend PutsWatcher
***=> #<IO:<STDOUT>>
***
pry(main)> puts "yo"
***yo***
***=> nil
***
pry(main)> 

顺便说一句,我不是建议你这样做...修补核心类通常是一个坏主意。我纯粹出于学术目的而提到它。