Simuler des tubes (pipe)
Source : http://redhanded.hobix.com/inspect/hoppingThroughPipesAndClosures.html (en)
Le but est de simuler les tubes (pipes), très souvent utilisés en shell. Par exemple :
#> ps aux | grep fcgi | wc -l
En ruby, on va d’abord rajouter la méthode « | » à la classe IO
class IO
def | proc
proc[self]
end
end
Ensuite, on crée les commandes, comme suit. Ici, une commande wc (word count) qui compte les lignes d’un flux d’ES.
wc = proc { |io| io.inject(0) { |i, line| i + 1 } }
Il suffit ensuite de chainer la commande comme en shell
nombre_de_lignes = open("/var/log/messages") | wc
Ensuite, on peux améliorer le tout pour pouvoir enchainer plusieurs commandes. Voir le source http://whytheluckystiff.net/ruby/ruby-pipe.rb
require 'stringio'
module Piping
def | proc; proc.call self; end
end
class IO
include Piping
def self.[](obj)
if obj.respond_to? :read
return obj
else
StringIO.new(obj.to_s)
end
end
end
class StringIO
include Piping
end
puis
wc = proc { |io| IO[io.inject(0) { |i, line| i + 1 }] }
grep = proc { |exp| proc { |io| IO[io.grep(exp)] } }
nombre_messages_ppp = open("/var/log/messages") | grep[/ppp/] | wc
p nombre_messages_ppp.read
Notons le .read à la fin, car nous enchainons des méthodes qui retournent un flux d’ES.

