当输出打印到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议你这样做…修补核心类通常是一个坏主意。 我纯粹为了学术目的而提及它。