Ils m'ont copiés ?
Quand on regarde le changelog de ruby 1.8.7_preview2, on peu lire ceci :
Mon Oct 15 21:57:07 2007 Akinori MUSHA <knu@iDaemons.org>
* NEWS: Mention ipaddr enhancements.
* lib/ipaddr.rb (in_addr, in6_addr, addr_mask): Make some minor
code optimization.
* lib/ipaddr.rb (<=>): Implement IPAddr#<=> and make IPAddr
comparable.
* lib/ipaddr.rb (succ): Implement IPAddr#succ. You can now create
a range between two IPAddr's, which (Range) object is
enumerable.
* lib/ipaddr.rb (to_range): A new method to create a Range object
for the (network) address.
* lib/ipaddr.rb (coerce_other): Support type coercion and make &,
|, == and include? accept a string or an integer instead of an
IPAddr object as the argument.
* lib/ipaddr.rb (initialize): Give better error messages.
* lib/ipaddr.rb: Improve documentation.
Ce que je voulais vous montrer là dedans, c'est l'ajout des méthodes <=>, succ et to_range à la classe ruby IPAddr. Cela permet de rendre IPAddr comparable et énumérable. Cela permet aussi d'avoir un objet Range entre deux objets IPAddr. C'est tout neuf et ça vient de sortir. Ces méthodes n'étaient pas là avant.
Mon problème (enfin c'est pas un problème, ou alors ça ne regarde que moi), c'est que dans mon exercice fétiche de démo de ruby, ip_detector.rb, je faisais implémenter aux stagiaires ces méthodes. C'était pratique parce que ça permettait de démontrer par l'exemple des conceptes présent dans ruby :
- l'extension de classe : on ajoute simplement des méthodes à une classe ruby quand on en a besoin et sans (trop) se poser de questions
- le duke typing : juste en implémentant <=> et succ. Un objet est énumérable s'il possède les méthodes <=> et succ. On applique cela à IPAddr, alors IPAdrr est énumérable.
- l'objet Range : grace la méthode to_range, on peut créer des ensembles d'IP. Utiliser les ensembles (fermés ou ouverts) est une notion qu'il faut voir en pratique pour bien assimiler.
Maintenant que cela est de base dans ruby, il va falloir que je trouve un autre exercice... :'(
Bon et puis il faut dire que Akinori MUSHA à bien implémenté ces méthodes puisqu'il prend bien en compte les familles d'adresses et qu'il retourne des clones des adresses en paramètre dans la méthode to_range. Ce que je ne faisais pas.






Sunny dit
le Mercredi 23 avril 2008 à 08h08
Génial exercice ! Utile, large et pointu c'est vraiment une chance qu'il manquait ces méthodes de base :p Il y a probablement un autre type d'objet à qui il manque l'énumérabilité de base, il faudrait faire un tour de toute la lib :)
Ton code est très chouette. En regardant le code je serais tenté de changer massive_auto_detection en :
Ou encore, pour faire découvrir yield et les blocs ;)
J'arrête là, une folle envie de faire du Ruby commence déjà à s'emparer de moi.
PS: Dans les commentaires si le Nom est requis le Site web facultatif, comment l'E-Mail peut-il être ni l'un ni l'autre ? :p
Meuble dit
le Mercredi 23 avril 2008 à 13h01
Merci Sunny pour tes compliments et tes améliorations sur mon exercice.
Concernant la méthode massive_auto_detection, je n'ai pas utilisé le select parce qu'après ça, on ajoute des améliorations pour avoir dans un tableau les IP répondant au ping, dans l'autre celle ne répondant pas, et divers autres infos.
Et pour le yield, il y a d'autres exercices, faut pas trop compliquer. ;-p
Sinon, pour le label du champs E-Mail, c'est un oublis de ma part, j'avais changé le formulaire pour avoir un anti-spam invisible aux utilisateurs et je n'avais pas bien fini les choses.
Aussi, les commentaires sont en markdown de base. Du coup ton code n'était pas beau. J'ai pris la liberté de modifier ton commentaire pour que ça passe bien, et j'ai rajouté une indication :-)
Sunny dit
le Mercredi 23 avril 2008 à 20h08
Merci :)