Monthly Archive for March, 2010

Marshal un hash avec proc

Il arrive souvent que l’on veut écrire un hash imbriqué, tel que objet[:unevaleur][:unesecondevaleur] accédant à la valeur :unesecondevaleur du hash contenu dans objet[:unevaleur]. Voici une implémentation simpliste de la chose.

[ruby]
X = Hash.new {|h, k| h[k] = Hash.new(0)}
[/ruby]

Avec ce code, à chaque fois qu’on crée un hash non-existant dans X, on ajoute un nouveau hash avec 0 comme valeur par défaut. Si maintenant on veut marshaller X, on obtient l’erreur suivante:

Marshal.dump(X)
TypeError: can’t dump hash with default proc

On obtient cette erreur puisque, lorsqu’on crée X, on a passé un bloc à new ce qui fait que lorsqu’on veut le marshaller, Ruby n’est pas mesure de marshaller le proc associé.
Afin d’être en mesure de marshaller X, il suffit simplement d’éliminer le proc en effectuant une copie vers un nouveau hash sans proc.

[ruby]
Y = Hash.new
X.each {|h, k| Y[h] = X[h]}
Marshal.dump(Y)
[/ruby]

Categories