2

我正在编写用于监视服务器状态的脚本。我可以用 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​​ 中实现相同的功能?换句话说,我想在用 ruby​​ 打印 stdout 时使用回调。

4

1 回答 1

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)> 

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

于 2011-10-22T14:26:25.503 回答