IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby Discussion :

Problème d'accès à un tableau défini dans une autre class


Sujet :

Ruby

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Problème d'accès à un tableau défini dans une autre class
    bonjour,
    en fait j'ai un problème en ce qui concerne l'accès à une variable (tableau définit dans une autre classe)
    le compilateur ne reconnait pas la variable dans la méthode affB(), voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    class A
     attr_accessor :tab
      def initialize()
         @tab=[]
      end
     
      def addA()
        @tab.push(1)
    	puts @tab.size
      end
     
      end
     
    class B
     
       def affB()
     
    	 puts @tab.size
     
    	end
      end
     
    class Test
     
     AA = A.new
     AA.addA
     BB = B.new
     BB.affB
     
     end


    message d'erreur : 'affB' undefined method 'size' for nil:NilClass

  2. #2
    Membre actif
    Profil pro
    Problem Solver
    Inscrit en
    Juin 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Problem Solver

    Informations forums :
    Inscription : Juin 2013
    Messages : 138
    Points : 231
    Points
    231
    Par défaut
    Bonjour,
    le principe d'avoir fait des classes est de "cacher" des informations au grand public pour éviter que tout le monde les triture.
    Je ne demande pas à mon laitier les informations de mon compte en banque !

    Par exemple, tu as rangé ton tableau dans un champ d'un objet de la classe A.
    Ce n'est pas pour le donner à B ! Ni pour que B aille tricher et regarder l'objet de la classe A (lequel d'ailleurs).

    Si tu as envie de voir le contenu du tableau de a, c'est lui qui l'a gardé, demande-lui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a = A.new
    a.push(1)
    a.push(2)
    a.tab # => [1,2]
    Mais ça ne sert à rien de demander à B.

    Ou alors tu as un cas réel et utile qui dit "B devrait pouvoir demander ça à A" et alors c'est ta hiérarchie de classes et ta modélisation des objets qui change.
    Par exemple "tous les B sont des amis d'un A, et quand on demande à B il peut nous redonner les infos de son copain A".
    Il faudrait alors ajouter dans chaque instance b le a qu'elle connaît, et soit il le copie au début, soit il le demande à chaque fois.

    Bon courage et à bientôt,

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    je crois que vous m'avez pas bien compris, en réalité j'ai 2 classes : Bibliotheque et Adherent, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class Bbliotheque
    attr_accessor : tableau_des_documents
     
    def initialize()
     @tableau_des_documents=[]
    end
     
    end  
     
     
    class Adherent
    attr_accessor :tableau_des_emprunts
     
    def initialize()
     @tableau_des_emprunts=[]
    end
     
    def emprunter(doc)
     if @tableau_des_documents.include?(doc)
        @tableau_des_emprunts.push(doc)
        @tableau_des_documents.delete(doc)
        @tableau_des_documents.compact
        end
    end
     
    end
    Ici la méthode emprunter(doc) va tester avec include? dans tableau_des_documents et on aura une erreur NilClass c'est ça le probleme.Dans l'exo que j'ai la methode emprunter doit exister dans la class Adherent

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il faut juste injecter une instance d'une bibliothèque dans Adherent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    class Bibliotheque
      attr_accessor :tableau_des_documents
     
      def initialize()
        @tableau_des_documents = []
      end
    end 
     
    class Doc; end
     
    class Adherent
      attr_reader :biblio
      attr_accessor :tableau_des_emprunts
     
      def initialize(biblio)
        @biblio = biblio # instance d'un biblio
        @tableau_des_emprunts = []
      end
     
      def emprunter(doc)
        if biblio.tableau_des_documents.include?(doc)
          tableau_des_emprunts.push(doc)
          biblio.tableau_des_documents.delete(doc)
          biblio.tableau_des_documents.compact
        end
      end
    end
     
    doc1 = Doc.new
    doc2 = Doc.new
     
    biblio1 = Bibliotheque.new
     
    biblio1.tableau_des_documents << doc1
    biblio1.tableau_des_documents << doc2
     
    p biblio1.tableau_des_documents
     
    bibi = Adherent.new biblio1
     
    bibi.emprunter(doc1)
    bibi.emprunter(doc2)
     
    # 
    p biblio1.tableau_des_documents #=> []
    p bibi.tableau_des_emprunts
    Ceci ce n'est pas forcement le meilleur moyen de faire ça car maintenant il y a une dépendance entre Adherent et Bibliotheque mais bon si l'exercice est comme ça...
    Autre chose, quand tu nommes des méthodes par exemple "tableau_des_emprunts", tu peux remplacer par "emprunts", on comprend qu'il s'agit d'une collection

    @+

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/03/2013, 13h07
  2. [Graphics View] Problème de récupération de QList<QGraphicsItem *> dans une autre classe
    Par ChevalierN dans le forum Débuter
    Réponses: 13
    Dernier message: 07/01/2012, 18h04
  3. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  4. Réponses: 1
    Dernier message: 24/08/2009, 12h03
  5. Problème thread dans une autre classe
    Par Shypster dans le forum C#
    Réponses: 19
    Dernier message: 06/03/2008, 09h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo