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

SGBD Perl Discussion :

Moose utilisation d attribut


Sujet :

SGBD Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2016
    Messages : 14
    Points : 14
    Points
    14
    Par défaut Moose utilisation d attribut
    Bonjour tout le monde,
    je suis novice en Moose. Au fait j'ai une base de données que je peux l'exécuter. Ma base de données je l'utilise comme Role ca marche très bien. Je peux exécuter mes Select Statements dans une fonction. Je n'arrive pas à utiliser l'attribut data dans mon attribut CurrentQuestion. Il me sort comme quoi use of unitialized value.

    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
    47
    package GameMooseFragen;
    use Moose;
    use DBI;
    use Data::Dumper;
     
    with 'DB';
     
     
    has data => (
      is => 'rw',
      default => sub {
        my $self = shift;
        $self->{data} = getDB();
        return $self->{data};
      },
      lazy => 1
    );
     
    has currentQuestion => (
      is      => 'rw',
      default => sub  {
        my $self = shift;
        my $question = $self->{data};
        return $question->{Fragen};
      },
    );
     
    sub getDB {
      my ($self) = shift;
      #print Dumper($self->{data});
     
      my $table = 'tab_Fragen';
      my @fields = qw( Fragenid Fragen Antwort_a Antwort_b Antwort_c );
      # geändert
      my $q = GameMooseFragen->new();
        # my $dbh = DBI->connect ($dsn, $user, $pwd) or die $DBI::errstr;
      my $sql = 'SELECT ' . join(', ', @fields) . " FROM $table";
     
     
      my $sth = $q->dbh->prepare($sql);
      $sth->execute() or die $DBI::errstr;
      return $sth->fetchall_arrayref;
      #$self->{data} = $sth->fetchall_arrayref;
      #print Dumper($self->{data});
      #return $self->{data};
     
    }
    si j'exécute

    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
    use strict;
    use warnings;
    use Data::Dumper;
    use GameMooseFragen;
     
    my $gmfragen = GameMooseFragen->new();
     
    #$gmfragen->nextQuestion();
     
    print Dumper ($gmfragen->data());
    #$gmfragen->getDB();
     
    #$gmfragen->question();
    print Dumper($gmfragen->currentQuestion());
    #print Dumper($gmfragen->{Fragenid});
    #print Dumper($gmfragen->Fragenid());
     
    print "blub\n";
    je récupère les données dans data mais dans currentQuestion j'ai undef.


    merci bien de jetter un coup d'oeil.
    Gracias.

  2. #2
    Membre émérite
    Inscrit en
    Janvier 2006
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 722
    Points : 2 719
    Points
    2 719
    Par défaut
    Je n'ai jamais utilisé Moose (je préfère les objets Perl classiques), mais voici typiquement le genre d'exemple qui va m'inciter à continuer comme ça: à force de vouloir faire plein de choses à la place du programmeur, au final ce dernier ne comprend même plus ce que le programme fait et dans quel ordre.

    Ici qu moment du GameMooseFragen->new() il va initialiser tous les attributs avec la méthode "default", sauf ceux pour lesquels tu as positionné lazy = 1

    Donc la méthode new va bien appeler la méthode currentQuestion->default mais pas data->default

    Plus tard tu vas faire un appel à $gmfragen->data() ce qui implique un appel à data->default
    Puis un appel à $gmfragen->currentQuestion. Sauf que...

    Sauf que ce second appel ne va pas entraîner un appel à currentQuestion->default ... puisque celui-là a déja été fait dans le constructeur !!! Or au moment de cet appel, $self->{data} était bien vide, donc c'est logique que la donnée ne contienne rien. Et là tu ne peux plus faire d'appel à default, c'est trop tard!

    Une solution simple ici serait de faire le remplacement suivant:

    Citation Envoyé par Sankara75 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    has currentQuestion => (
      is      => 'rw',
      default => sub  {
        my $self = shift;
        my $question = $self->data();
        return $question->{Fragen};
      },
    );
    }
    Comme ça, même si lazy empêche l'appel au moment de la construction, le fait que currentQuestion fasse un appel à data() entrainera cet appel de toute façon. Mais du coup, garder lazy sur l'attribut data devient de fait peu pertinent s'il est appelé par un autre attribut qui ne l'est pas.

Discussions similaires

  1. utiliser les attribut d'une classe dans une autre classe
    Par kaissaoui dans le forum Langage
    Réponses: 11
    Dernier message: 18/07/2007, 15h13
  2. [xslt][xpath]Utilisation des attributs XML
    Par Little_flower dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 15/05/2007, 12h42
  3. Problème d'utilisation des attributs width et height avec une image distante
    Par Ptit_Mouss dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/09/2006, 15h40
  4. Réponses: 2
    Dernier message: 24/08/2006, 17h48
  5. [LDAP] Utiliser l'attribut Jpegphoto
    Par krikrizzz34 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 22/05/2006, 20h09

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