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

Langage Perl Discussion :

Référence d'un méthode d'objet


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 41
    Par défaut Référence d'un méthode d'objet
    Bonjour,

    Dans mon script j'utilise un hash qui ressemble à ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        my %items = (
                T_ENV()         => [ \$this->$_showEnv,          [ O_NAME, O_SITE ] ],
                O_SITE()        => [ \&showSite,        [ O_NAME ] ],
                O_HOST()        => [ \&showHost,        [ O_NAME, O_SITE, O_TYPE ] ],
                O_CELL()        => [ \&showCell,        [ O_NAME, O_SITE, O_TYPE, O_HOST ] ],
                O_APPLI()       => [ \&showApp,         [ O_NAME, O_SITE, O_TYPE, O_CELL, O_HOST, O_NODES, O_STATUS, O_DETAIL,
                                                          O_FILE_SERVING, O_MESA_RESTART, O_MESA_RIPPLE, O_RUNNING, O_START_ON_BOOT,
                                                          O_SINGLE, O_SUPERVISED, O_STOP_EXPIRED ] ],
                O_EAR()         => [ \&showEAR,         [ O_NAME, O_SITE, O_APPLI ] ],
        );
    La valeur associée à la clé de ce hash correspond donc à un tableau anonyme contenant une référence vers une fonction ainsi qu'un autre tableau anonyme.

    C'est la référence vers la fonction qui me pose problème (première ligne). Cela fonctionnait avant que cette fonction ne devienne une méthode d'objet (lignes suivantes), quelle syntaxe peut me permettre de retrouver le même fontionnement qu'avant ?

    Merci d'avance pour votre aide.

    Complément d'infos : actuellement cette syntaxe fonctionne mais la méthode est appelée dès la déclaration du hash. De plus cet appel plante puisqu'aucun paramètre n'est passé à la méthode.

    L'appel est fait par la suite avec la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &{$items{$options->{+O_ITEM}}->[0]}($context, $appConfig, $infraConfig, $options);

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Difficile de rendre le comportement "identique" pour des clés de type différents :
    - la première ligne fait référence à la méthode d'un objet donné : il y a deux données, dont l'une est une référence, l'autre une méthode, donc une propriété de type sub de l'objet
    - la deuxième ligne (et les autres) fait référence à une fonction "globale" non liée à un objet. Il est donc aisé d'en récupérer la référence.

    Lors de l'appel d'une méthode d'un objet, il y a un paramètre "implicite" qui est passé à la fonction : $this. Pour rendre générique le processus, il faudrait tenter de violer l'objet. Nous supposerons que la classe de l'objet soit "SITE" et que showEnv en soit une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        my %items = (
                T_ENV()         => [ \&SITE::showEnv,          [ O_NAME, O_SITE ] ],
                O_SITE()        => [ \&showSite,        [ O_NAME ] ],
                O_HOST()        => [ \&showHost,        [ O_NAME, O_SITE, O_TYPE ] ],
                O_CELL()        => [ \&showCell,        [ O_NAME, O_SITE, O_TYPE, O_HOST ] ],
                O_APPLI()       => [ \&showApp,         [ O_NAME, O_SITE, O_TYPE, O_CELL, O_HOST, O_NODES, O_STATUS, O_DETAIL,
                                                          O_FILE_SERVING, O_MESA_RESTART, O_MESA_RIPPLE, O_RUNNING, O_START_ON_BOOT,
                                                          O_SINGLE, O_SUPERVISED, O_STOP_EXPIRED ] ],
                O_EAR()         => [ \&showEAR,         [ O_NAME, O_SITE, O_APPLI ] ],
        );
    Lors de l'appel, si les différentes clés ne sont pas toutes du même type (fonction globale ou méthode, il faudrait alors écrire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (ref($method) ne "SITE") {
      $method->(...);
    }
    else {
      $this->$method(); # ou encore $method->($this, ...); si cela échoue
    }
    Maintenant, si tu comptes migrer toutes les clés en méthode d'objet, indique le moi, je me raviserai : il y aura sans doute plus simple.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 41
    Par défaut
    Merci pour cette réponse.

    A terme je n'aurai dans mon hash que des références vers des méthodes d'objets, c'est à dire que des appels du type que tu proposes :

    J'ai testé avec cette suggestion, c'est mieux, lors de la déclaration du hash, la méthode n'est plus invoquée et je n'ai plus d'erreur. En revanche quand arrive la phase d'appel de cette méthode avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &{$items{$options->{+O_ITEM}}->[0]}($context, $appConfig, $infraConfig, $options);
    Cela ne fonctionne pas, je vois bien dans le debugger que la référence vers la méthode ne semble pas résolue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      DB<1> x $items{$options->{+O_ITEM}}
    0  ARRAY(0x15aa740)
       0  CODE(0x15aa6c0)
          -> &CODE(0x15aa6c0) in ???
       1  ARRAY(0x15aa5e0)
          0  'name'
          1  'site'
    Une idée ?

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Si tout sera cohérent, oublie la méthode précédente (qu'il aurait fallu débugger pour corriger).
    Utilise cette méthode à la place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        my %items = (
                T_ENV()         => [ showEnv =>          [ O_NAME, O_SITE ] ],
                O_SITE()        => [ showSite =>        [ O_NAME ] ],
                O_HOST()        => [ showHost =>        [ O_NAME, O_SITE, O_TYPE ] ],
                O_CELL()        => [ showCell =>        [ O_NAME, O_SITE, O_TYPE, O_HOST ] ],
                O_APPLI()       => [ showApp =>         [ O_NAME, O_SITE, O_TYPE, O_CELL, O_HOST, O_NODES, O_STATUS, O_DETAIL,
                                                          O_FILE_SERVING, O_MESA_RESTART, O_MESA_RIPPLE, O_RUNNING, O_START_ON_BOOT,
                                                          O_SINGLE, O_SUPERVISED, O_STOP_EXPIRED ] ],
                O_EAR()         => [ showEAR =>         [ O_NAME, O_SITE, O_APPLI ] ],
        );
     
    ...
    Edit : pour l'usage, je poste dans le prochain message

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    En fait, je comprends pas trop à quoi correspondent les clés de %items ?
    Des scalaires retournés par des fonctions ? (T_ENV() par exemple).

    Tentative d'écrire l'appel d'une méthode (sans paramètre) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $method = $items{T_ENV()}->[0];
    $this->$method();
    Je n'ai pas trouvé de moyen d'écrire cela en une seule ligne (le nom de la méthode ne peut être qu'un bareword ou un scalaire, pas une expression plus complexe).

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Je n'ai pas trouvé de moyen d'écrire cela en une seule ligne (le nom de la méthode ne peut être qu'un bareword ou un scalaire, pas une expression plus complexe).
    La seule méthode que j'ai trouvé, très moche, est de déréférencer après voir pris la référence avec \ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->${\$items{T_ENV()}->[0]}();
    (sous réserve ; mais je trouve ça vraiment très moche).

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 41
    Par défaut
    Ben écoute cette méthode me convient parfaitement, ça fonctionne très bien, j'ai juste eu besoin de rajouter des guillemets autour du nom de la méthode dans le hash.

    Merci beaucoup pour ton aide précieuse.

    Pour info le T_ENV() est simplement une constante, les () sont nécessaires pour que ce soit le contenu de la constante qui soit utilisée et pas la chaine "T_ENV" (cas particulier d'une constante utilisée comme clé d'un hash).

    Encore merci.

Discussions similaires

  1. référence sur la méthode d'un objet
    Par kirbby dans le forum Langage
    Réponses: 2
    Dernier message: 25/04/2008, 11h17
  2. [objet] appeler une méthode d'objets contenus dans un tableau (iterator ?)
    Par psychomatt dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/09/2006, 16h28
  3. [PHPTAL] gestion des méthodes des Objets
    Par ronio dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 06/03/2006, 14h29
  4. [POO] affectation dynamique d'une méthode à un objet
    Par Delphi-ne dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/02/2006, 21h17
  5. Ajouter un méthode à un objet
    Par norvel dans le forum Access
    Réponses: 2
    Dernier message: 03/10/2005, 16h50

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