OVH Cloud OVH Cloud

pas de ref sur methode ?

2 réponses
Avatar
espie
J'ai besoin d'implementer un visitor.

Apres avoir lu et relu la doc, je ne trouve aucun idiome qui
me permette d'avoir une reference sur methode, independamment
du package concerne (l'analogue du `pointer to member' de C++).

Plus precisement, si j'ai une fonction normale f, je sais que je
peux utiliser &f pour avoir une reference dessus.
Et je peux stocker ca quelque part pour mes appels:
f(args)
devient
my $r = &f; &$r(args);

Maintenant, si j'ai une methode m, que j'appelle par
$o->m(args);
je n'ai pas de construction similaire.
Je peux ecrire:
my $r='m'; $o->$r(args);
qui marche, meme avec use strict et use warnings, mais je soupconne
que c'est pas super-efficace...

Des idees ?

2 réponses

Avatar
Samuel Mouniée
Bonjour,


Marc Espie wrote:

J'ai besoin d'implementer un visitor.

Apres avoir lu et relu la doc, je ne trouve aucun idiome qui
me permette d'avoir une reference sur methode, independamment
du package concerne (l'analogue du `pointer to member' de C++).

Plus precisement, si j'ai une fonction normale f, je sais que je
peux utiliser &f pour avoir une reference dessus.
Et je peux stocker ca quelque part pour mes appels:
f(args)
devient
my $r = &f; &$r(args);

Maintenant, si j'ai une methode m, que j'appelle par
$o->m(args);
je n'ai pas de construction similaire.
Je peux ecrire:
my $r='m'; $o->$r(args);
qui marche, meme avec use strict et use warnings, mais je soupconne
que c'est pas super-efficace...

Des idees ?




les fermetures et les methodes anonymes.

sinon :

$self->$methode( @args );

marche tres bien avec le bon contexte ;)

sinon reste le violent :

while( $sub = &$sub ) {};

et avec une couche objet adequat :

$sub = &$sub while $sub->isa( "subobject" );


.sn'uoM

Avatar
Paul Gaborit
À (at) Mon, 23 Aug 2004 10:13:28 +0000 (UTC),
(Marc Espie) écrivait (wrote):
Apres avoir lu et relu la doc, je ne trouve aucun idiome qui
me permette d'avoir une reference sur methode, independamment
du package concerne (l'analogue du `pointer to member' de C++).

Plus precisement, si j'ai une fonction normale f, je sais que je
peux utiliser &f pour avoir une reference dessus.
Et je peux stocker ca quelque part pour mes appels:
f(args)
devient
my $r = &f; &$r(args);


L'appel me semble plus clair avec cette syntaxe :

$r->(...args...);

Et, dans certains cas, cela évite les effets de bords de l'usage de &.

Maintenant, si j'ai une methode m, que j'appelle par
$o->m(args);
je n'ai pas de construction similaire.
Je peux ecrire:
my $r='m'; $o->$r(args);
qui marche, meme avec use strict et use warnings, mais je soupconne
que c'est pas super-efficace...


C'est pourtant la bonne façon de faire. Et ce n'est pas plus inefficace
qu'autres choses (pour l'instant). Dans de futures versions de Perl, le
compilateur pourra optimiser l'appel si il connait, à la compilation, le type
de l'objet et le nom de la méthode mais ce n'est pas le cas encore (à ma
connaissance).

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>