Как перегрузить строки в Perl - PullRequest
2 голосов
/ 02 февраля 2012

Я пытался перегрузить классы в строки в Perl.Например:

use MooseX::Declare;

class overloadingInPerl{
    use overload '""' => sub {shift->printOut()};


    method printOut(){
       return "Overloading worked";
    }
}


my $overloadingTrial = overloadingInPerl->new();
print $overloadingTrial;

распечатывает: overloadingInPerl = HASH (0x1f520fc)

хотите напечатать: перегрузка сработала

Любые идеи?

Ответы [ 2 ]

3 голосов
/ 02 февраля 2012

Вы должны добавить грязную черту , чтобы использовать перегрузку

class overloadingInPerl is dirty {
1 голос
/ 02 февраля 2012

Кроме добавления черты dirty, как указано @oylenshpeegul, вы также можете удалить coderef, вызывающий реальную функцию, передав ее имя в виде строки и удалив () из объявления метода.Проще показать, чем сказать.

#!/usr/bin/env perl                                                               
use Test::More tests=>1;                                                          
use MooseX::Declare;                                                              
class C is dirty {                                                                
    use overload '""' => 'to_string';                                             
    method to_string { sprintf "#<%s data='%s'>", $self->meta->name, $self->data }
    has data => (is=>'rw',default=>'');                                           
}                                                                                 
is(C->new(data=>'hello'), "#<C data='hello'>");                                   
...