Indexation en Ruby

Indexation en Ruby - Ruby/Rails - Programmation

Marsh Posté le 26-11-2013 à 20:34:56    

Bonjour,
 
Pour mes cours de Ruby je doit refaire la commande tree.
 
Voici l'explication de mon prof

Citation :

Le module Tree doit implémenter la méthode each qui sert à itérer simplement sur les enfants d'un noeud.
Comme la plupart des méthodes each en Ruby (Array, Hash...) elle prend en paramètre un code block (cf fin du module 2) qui sera appelé pour chacun des enfants. En + de ce code block, elle prend un paramètre optionnel (Boolean) qui va lui indiquer si elle doit itérer sur les enfants de ce noeud uniquement, ou bien aussi sur les petits-enfants etc récursivement.
Voici un exemple d'utilisation du module Tree sur une classe A, avec un exemple d'utilisation de la méthode each:


 
La je bloque avec ce code
 

Code :
  1. module TreeEmpty
  2. @empty = []
  3. def self.<< (childNode)
  4.   @empty << childNode
  5. end
  6. end
  7. class StringIndexer
  8. include TreeEmpty
  9. end
  10. a1, a2, a3, a4 = StringIndexer.new, StringIndexer.new, StringIndexer.new
  11. a1 << a2
  12. a1 << a3
  13. a3 << a4
  14. a1.each { |child| puts ' '}.each do |child|
  15. puts '+-' + @empty[child]
  16. end


 
lorsque je compile j'ai cette erreur : indexation.rb:27:in `<main>': undefined method `<<' for #<StringIndexer:0x00000001d50948> (NoMethodError)


---------------
Made you your own sentence without believing that of the others...
Reply

Marsh Posté le 26-11-2013 à 20:34:56   

Reply

Marsh Posté le 26-11-2013 à 22:36:16    

A la ligne 19, ça plante. Si tu veux utiliser la << comme une méthode dans de la classe StringIndexer il faut déclarer le module comme ça :

Code :
  1. module TreeEmpty
  2.   @empty = []
  3.   def << (childNode)
  4.      @empty << childNode
  5.   end
  6. end


 
A la ligne 21 tu auras un autre crash, parce que a4 n est pas initialisé.
 
A la ligne 23, tu n'as pas encore défini each donc ça ne marchera pas quand le programme fonctionnera enfin jusqu'à cette ligne.

Message cité 1 fois
Message édité par czh le 26-11-2013 à 22:37:02
Reply

Marsh Posté le 27-11-2013 à 08:47:49    

czh a écrit :

A la ligne 19, ça plante. Si tu veux utiliser la << comme une méthode dans de la classe StringIndexer il faut déclarer le module comme ça :

Code :
  1. module TreeEmpty
  2.   @empty = []
  3.   def << (childNode)
  4.      @empty << childNode
  5.   end
  6. end


 
A la ligne 21 tu auras un autre crash, parce que a4 n est pas initialisé.
 
A la ligne 23, tu n'as pas encore défini each donc ça ne marchera pas quand le programme fonctionnera enfin jusqu'à cette ligne.


 
Merci pour le coup de main,
 
J'ai effectué les changement hier et maintenant tous fonctionne bien mais rien ne s'affiche  :heink:  
Mais je pense que c'est plus un soucis de compréhension du sujet.  
 
Encore merci


---------------
Made you your own sentence without believing that of the others...
Reply

Marsh Posté le 27-11-2013 à 21:33:11    

De nouveaux moi,
 
Je suis presque au bout du premier chapitre de mon code.
 
J'ai l'impression que tout fonctionne correctement sauf mon affichage
 
Pour commencer voici mon code :
 

Code :
  1. module TreeEmpty
  2.     def initialize
  3.      @empty = []   
  4.     end
  5.    
  6.     def << (childNode)       
  7. @empty << childNode
  8.     end
  9.     def each(recursive = false)
  10. if recursive && @empty > 0
  11.  @empty.each do |i|
  12.   yield i
  13.   @empty.each
  14.   i.each { |j| yield j }
  15.  end
  16. else
  17.  @empty.each do |i|
  18.   yield i
  19.  end
  20. end
  21.     end
  22.  
  23. end
  24. class StringIndexer
  25.     include TreeEmpty
  26.  
  27. end
  28. a1, a2, a3, a4 = StringIndexer.new, StringIndexer.new, StringIndexer.new
  29. a1 << a2
  30. a1 << a3
  31. a3 << a4
  32. a1.each{ |i| puts i  }


 
Au niveau du block de code pour l'appel de la méthode each a1.each{ |i| puts i  }, j'avou avoir du mal à comprendre ce que je doit mettre à l'intérieur... Car lors de l'itération si les noeuds sont bien effectués cela devrait m'afficher a2 et a3 (en mode non récursif )
 
sauf que voilà ce que ça m'affiche  
 
#<StringIndexer:0x000000026aad40>
#<StringIndexer:0x000000026aacf0>

 
Merci de votre aide
 
 
 
 


---------------
Made you your own sentence without believing that of the others...
Reply

Marsh Posté le 02-12-2013 à 10:20:02    

puts i c'est l'équivalent de puts i.to_s, c'est à dire un appelle de la méthode to_s (to string) sur ton objet.
 
Ici, l'implémentation de la méthode est celle de la classe Object, vu que tu ne la redéfini pas dans StringIndexer. Le to_s de Object t'affiche l'adresse mémoire de la référence vers ton objet, ce que tu vois en sortie.
 
Si tu veux donner un nom à tes instances de StringIndexer, tu dois le stocker dans ton objet, et redéfinir to_s.

Reply

Marsh Posté le 02-12-2013 à 10:32:00    

Bonjour,
 
Merci pour la réponse,
 
Si j'ai compris je doit redéfinir to_s dans ma classe pour qu'il puisse lire directement mon objet et non son adresse mémoire?


---------------
Made you your own sentence without believing that of the others...
Reply

Marsh Posté le 02-12-2013 à 10:40:11    

C'est l'idée.
 
Maintenant il faut aussi que tu définisse ce que to_s devra afficher. De ce que je comprend de ton problème, tu voudras afficher le nom de ton nœud, donc il faut qu'à un moment donné (la création de l'objet au hasard), tu le lui donnes, et que tu le stockes dans une variable. C'est la valeur de cette variable que retournera ton to_s.

Reply

Marsh Posté le 02-12-2013 à 10:42:26    

Oki,
 
Merci pour l'explication, surtout que je crois bien que c'est l'idée du prochain point de ce projet.


---------------
Made you your own sentence without believing that of the others...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed