12
votes

Pourquoi ne "utilise pas la surcharge" fonctionner avec "Utiliser l'espace de noms: autocléan"?

OK juste pour la surcharge de la vérification de la santé mentale ne semble pas fonctionner pour moi. Je ne sais pas si c'est la version de Perliois, ou la version de surcharge.pm, ou quelque chose de mal à la manière dont j'ai la mise en œuvre, mais ce code ne fonctionne pas pour moi.

Version PERL P>

 $VAR1 = 12900840;


0 commentaires

3 Réponses :


16
votes

Espace de noms :: Autoclean code> est fitzing avec la magie que surcharge code> ajoute pour gérer votre opérateur. Ce qui suit fonctionne comme vous l'attendez:

package Token;

use Moose;
use Moose::Util::TypeConstraints;

use overload '+' => '_overload_add';

has 'secretvalue' => ( is => 'rw', isa => 'Int');

sub _overload_add{
    my ( $one, $two ) = @_;
    my $value = $one->secretvalue() + $two->secretvalue();
    return ($value);
}

1;


3 commentaires

+1 Pour trouver une solution après avoir pilonné la tête sur le bureau pendant une heure ou deux essayant de trouver le problème avec mon code. Bugs de la bibliothèque stupide!


Été là, fait ça. :) J'étais assez déconcerté par votre problème aussi jusqu'à ce que je me souvienne que surcharge a fonctionné en insérant des symboles magiques et je me demandais si autoclean était en train de jouer avec eux.


@nodebunny, pourquoi se plaindre du code des autres personnes lorsque vous pouvez écrire le vôtre? :) Cette question m'a inspiré à écrire Espace de noms :: balayage < / a> qui ne piquera pas vos surcharges. Plus d'infos ici .



10
votes

SO Friedo est absolument correct; Le problème réside dans la classe heuristique :: MOP utilise pour déterminer ce qui est et ce qui n'est pas une "méthode". Généralement, tout ce qui est importé d'un autre paquet n'est pas une méthode et des surcharges techniquement qualifiées de cela. Depuis l'espace de noms :: Autoclean demande la classe :: MOP Quelles méthodes existent pour le colis et supprime le reste, AutoClean purge aveuglément des surcharges avec tout le reste.

qui est assez surprenant, je pense.

Moosex :: MarkasMethods aidera à cela pour les classes d'orignal; Il fonctionne avant l'autocléan et dit à Moose de reconnaître les symboles de code de surcharge pour cet emballage en tant que méthodes. Cela épargne la hache d'Autoclean et a l'avantage supplémentaire que vous pouvez désormais utiliser des surcharges dans des rôles, les consommer et les faire "de travailler". (Divulgation complète: j'ai écrit MX :: MarkasMethods après que mon Autoclean Fix a été rejeté il y a 2 ans.)

Cependant, cela ne vous aide pas avec les classes non-orignaux que vous voudrez peut-être utiliser Autoclean avec ... La suppression des surcharges par Autoclean est au mieux une faille à l'autocléan.


1 commentaires

FLAW est en train d'être trop gentil, Espace de noms :: Autoclean est à plat cassé à cause de cela. Votre correctif était parfait BTW, il est dommage que le mainteneur soit obstiné.



0
votes

J'ai eu le même problème (en essayant de surcharger "" code> dans mon cas), mais je n'ai pas encore de MOOSEX :: MarkasMethods pour le travail encore. Non encore examiné pourquoi correctement, mais une solution alternative que a fait em> le travail était d'utiliser Moosex :: Rôle :: Finveroverloading (et puisque j'ai déjà utilisé divers rôles, il est facilement installé).

package MyClass;
use Moose;
use namespace::autoclean;
with 'MyRole';

package MyRole;
use MooseX::Role::WithOverloading;

use overload '""' => sub { ... };


0 commentaires