Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

exists pour une méthode ?

5 réponses
Avatar
CrazyCat
Bonjour,

Au sein d'un script, j'ai besoin de tester l'existence d'une méthode
d'un objet.
J'essaye avec exists() mais quelles que soient mes tentatives, j'ai
toujours:
exists argument is not a subroutine name at lib/GA/DBI.pm line 35.

Est-il possible de simplement faire ce test ?

--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr

5 réponses

Avatar
espie
In article <hd94j6$1hd$, CrazyCat wrote:
Bonjour,

Au sein d'un script, j'ai besoin de tester l'existence d'une méthode
d'un objet.
J'essaye avec exists() mais quelles que soient mes tentatives, j'ai
toujours:
exists argument is not a subroutine name at lib/GA/DBI.pm line 35.

Est-il possible de simplement faire ce test ?



Tous les objets heritent de UNIVERSAL, suffit de faire un can() pour
savoir si la methode est possible.

Si c'est pour faire de la delegation et creer des methodes au vol,
c'est plutot du ressort de la classe, et en general, suffit de
definir AUTOLOAD pour faire ce qu'on veut (attention a gerer
le cas particulier du destructeur).
Avatar
CrazyCat
Marc Espie wrote:
Au sein d'un script, j'ai besoin de tester l'existence d'une méthode
d'un objet.
J'essaye avec exists() mais quelles que soient mes tentatives, j'ai
toujours:
exists argument is not a subroutine name at lib/GA/DBI.pm line 35.

Est-il possible de simplement faire ce test ?


Tous les objets heritent de UNIVERSAL, suffit de faire un can() pour
savoir si la methode est possible.



Je vous prierais de ne pas m'insulter en des termes qui me sont incconus :D

Plus sérieusement, comment cela fonctionne-t-il ?

J'ai essayé:
if (can(OBJ->method)) et if (can(method))
Le premier passe la compilation mais pas l'exécution, le second me dit
"Bareword "method" not allowed while "strict subs" in use" Oublierais-je

Si c'est pour faire de la delegation et creer des methodes au vol,
c'est plutot du ressort de la classe, et en general, suffit de
definir AUTOLOAD pour faire ce qu'on veut (attention a gerer
le cas particulier du destructeur).



Non, il s'agit juste de déterminer si je suis dans un contexte ou un
autre, afin de gérer des fonctionnements différents.

--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Avatar
CrazyCat
CrazyCat wrote:
Tous les objets heritent de UNIVERSAL, suffit de faire un can() pour
savoir si la methode est possible.


J'ai essayé:
if (can(OBJ->method)) et if (can(method))
Le premier passe la compilation mais pas l'exécution, le second me dit
"Bareword "method" not allowed while "strict subs" in use" Oublierais-je



Je me réponds à moi même:
Avec OBJ->can('method') cela semble passer, est-ce correct ?

--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Avatar
espie
In article <hd97fp$55i$, CrazyCat wrote:
CrazyCat wrote:
Tous les objets heritent de UNIVERSAL, suffit de faire un can() pour
savoir si la methode est possible.


J'ai essayé:
if (can(OBJ->method)) et if (can(method))
Le premier passe la compilation mais pas l'exécution, le second me dit
"Bareword "method" not allowed while "strict subs" in use" Oublierais-je



Je me réponds à moi même:
Avec OBJ->can('method') cela semble passer, est-ce correct ?



Ben oui. Comme je le disais, tout le monde herite de UNIVERSAL, donc suffit
d'appeler la methode can, qui existe toujours...

Accessoirement, comme toujours en perl, UNIVERSAL est documente, donc dans
le pire des cas, tu peux verifer sur la doc. Je me contentais de donner un
pointeur sur une info qui est facilement disponible (sachant qu'il n'est
pas forcement simple d'intuiter l'existence d'UNIVERSAL et d'UNIVERSAL::can
si on n'est pas au courant, mais qu'une fois qu'on sait, c'est censement
trivial).

Si ces trucs te posent des soucis, je ne saurais trop
de conseiller de lire ou relire perlboot, perltoot, et perltooc.
Avatar
CrazyCat
Marc Espie wrote:
Si ces trucs te posent des soucis, je ne saurais trop
de conseiller de lire ou relire perlboot, perltoot, et perltooc.



Merci de ces bons conseils. A force de passer d'un langage à l'autre, je
m'y perds un peu et les bonnes habitudes sont dures à reprendre, mais
elles reviennent.

--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr