2010-05-03 2 views
14

Date::Simple Les objets affichent ce comportement, où $date++ renvoie la date du jour suivant.Comment puis-je définir le comportement pré/post-incrément dans les objets Perl?

Date :: Les objets simples sont immuables. Après l'affectation de $ date1 à $ date2, aucune modification de $ date1 ne peut affecter $ date2. Cela signifie, par exemple, qu'il n'y a rien comme une opération set_year, et que $ date ++ affecte un nouvel objet à $ date.

Comment peut-on définir sur mesure le comportement pré/post-incrémentale d'un objet, tel que ++$object ou $object-- effectue une action particulière?

J'ai effleuré perlboot, perltoot, perltooc et perlbot, mais je ne vois pas d'exemples montrant comment cela peut se faire.

+1

+1 pour une question qui aurait probablement dû remonter ici il y a longtemps. –

Répondre

12

Vous voulez overload. J'ai vérifié, et apparemment ce n'est pas une dupe.

package Number; 

use overload 
    '0+' => \&as_number, 
    '++' => \&incr, 
; 

sub new { 
    my ($class, $num) = @_; 

    return bless \$num => $class; 
} 

sub as_number { 
    my ($self) = @_; 

    return $$self; 
} 

sub incr { 
    my ($self) = @_; 

    $_[0] = Number->new($self->as_number + 1); # note the modification of $_[0] 
    return; 
} 

package main; 

my $num = Number->new(5); 
print $num  . "\n"; # 5 
print $num++ . "\n"; # 5 
print ++$num . "\n"; # 7 
+0

Merci pour l'édition, cjm; maintenant je connais la convention link-to-docs. :) – darch

+1

+1 Bel exemple. Vous voudrez peut-être rendre le comportement de «++» non standard afin que les autres puissent voir/sentir la différence – Zaid

7

Si vous regardez perlfaq7 vous trouverez que la réponse est d'utiliser le overload pragma, mais ils auraient probablement pu compte tenu de la question FAQ un meilleur nom (à mon avis).

package SomeThing; 

use overload 
    '+' => \&myadd, 
    '-' => \&mysub; 

En gros (en supposant $a est un objet de la classe SomeThing et $b n'est pas), le serait au-dessus surchargez $a + $b être $a->myadd($b, 0) et $b + $a-$a->myadd($b, 1) (c'est le troisième argument est un sens booléen « étaient les arguments de cet opérateur sont retournés "et la syntaxe premier-argument-is-self est préservée), et la même chose pour - et mysub.

Lisez la documentation pour obtenir une explication complète.

+0

Cool! Cela ouvre toutes sortes de possibilités ... – Zaid

+2

Huh, c'est un titre terrible pour une FAQ. C'est aussi une très mauvaise réponse. Je vais l'ajouter à ma liste de choses à réparer. –

Questions connexes