vendredi 7 décembre 2007

FIFO : une file en Ruby

FIFO : First In, First Out. Le premier arrivé est le premier servi, comme théoriquement dans une file d'attente (quand les grugeurs sont en RTT...). Grand classique de l'informatique, la "file" ("queue" en anglais), ici en version Ruby. En général, on l'implémente avec des cellules ayant pour attributs : la valeur stockée, un chemin (pointeur) vers la cellule suivante et parfois un chemin vers la précédente. En Ruby, pas de pointeurs, donc ma modeste version est à base de tableau.

Le code :

class Fifo

def initialize an_array
@conten = an_array
end

def add val
@conten.push val
end

def add_sev an_arr
for i in an_arr
self.add i
end
end

def remove number = 1
temp = @conten[number, @conten.size-1]
@conten = temp
end

def lenght
@conten.size
end

def cell int
@conten[int]
end

def print
str = ""
for i in (0...@conten.size)
str = str + "[ " + @conten[i].to_s + " ]->"
end
str = str + " nil "
puts str
end

def include? val
@conten.include? val
end

end
C'est une classe très simple, qui respecte l'approche objet par son côté : pas d'accès direct aux données (sauf aux valeurs des cellules en lecture via cell). add pour ajouter un élément, add_sev pour plusieurs (idéalement, une seule méthode avec condition sur la variable d'entrée devrait suffire mais bon...) remove x pour retirer x éléments. print pour l'affichage, include? pour savoir si un objet se trouve dans la liste et enfin lenght pour obtenir la longueur de la file.

Testons, avec 2 cellules arrivant à chaque itération et entre 0 et 2 qui sortent : vous avez dit "bouchon" ?

a = Fifo.new ["first one !"]
for i in (0...20)
a.add_sev [rand(100), rand(100)]
a.print
a.remove rand(3)
end
Alors, ça avance ?

0 commentaires: