Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
914 connectés 

  FORUM HardWare.fr
  Programmation
  Ruby/Rails

  Indexation en Ruby

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Indexation en Ruby

n°2211760
OrcusZ
Pro AMD | .Net lover
Posté le 26-11-2013 à 20:34:56  profilanswer
 

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...
mood
Publicité
Posté le 26-11-2013 à 20:34:56  profilanswer
 

n°2211797
czh
Posté le 26-11-2013 à 22:36:16  profilanswer
 

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
n°2211818
OrcusZ
Pro AMD | .Net lover
Posté le 27-11-2013 à 08:47:49  profilanswer
 

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...
n°2211947
OrcusZ
Pro AMD | .Net lover
Posté le 27-11-2013 à 21:33:11  profilanswer
 

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...
n°2212351
LeRiton
Posté le 02-12-2013 à 10:20:02  profilanswer
 

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.

n°2212355
OrcusZ
Pro AMD | .Net lover
Posté le 02-12-2013 à 10:32:00  profilanswer
 

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...
n°2212359
LeRiton
Posté le 02-12-2013 à 10:40:11  profilanswer
 

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.

n°2212361
OrcusZ
Pro AMD | .Net lover
Posté le 02-12-2013 à 10:42:26  profilanswer
 

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...

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Ruby/Rails

  Indexation en Ruby

 

Sujets relatifs
[recrutement] Recherche programmeur Ruby on RailsSockets: Question générale (pas seulement Ruby)
Ruby gem xmlsimpleMigrer un projet de ruby 1.8.6 vers 2.0
indexation de mon forumHelp pour index of au lieu du site !
Apprendre Ruby/Rais en 2010Ruby grep
ruby et sketchup[Ruby] exécution d'une commande 'echo' avec ruby [résolu]
Plus de sujets relatifs à : Indexation en Ruby


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR