如何在ruby中将输出打印到标准输出时使用回调
问题描述:
我正在编写用于查看服务器状态的脚本。 我可以在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打印标准输出时使用回调。
答
可能有更好的方法来做到这一点,但你可以做这样的事情:
module PutsWatcher
def puts(string)
super("***#{string}***")
end
end
$stdout.extend PutsWatcher
puts "here"
# => "***here***"
这是一个有点古怪,如果你这样做的IRB或撬,因为它们产生的输出本身之上你自己(即nil
你这样做之后puts
),但这里是从撬复制/粘贴:
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)>
顺便说一句,我不建议你这样做......修补核心课程通常是一个坏理念。我纯粹为了学术目的而提及它。
其实我没打算这样的事情。 例如,如果我写这样的代码, 'puts'iostat -w 1'' 我从来没有得到结果,因为iostat会继续输出。 但是,我想每秒都得到结果,然后每次连续处理它。 –