当输出打印到rubystdout时,如何使用callback

我正在编写观看服务器状态的脚本。 我可以写在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打印标准输出时使用callback。

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

 module PutsWatcher def puts(string) super("***#{string}***") end end $stdout.extend PutsWatcher puts "here" # => "***here***" 

如果你在IRB或Pry中这样做,有点奇怪,因为他们自己产生输出,也就是在你做出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)> 

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