El operador de sobrecarga bool
se encarga de la conversión a valores lógicos.
La correspondiente subrutina será invocada en cualquier contexto en el que aparezca
el objeto de la clase y Perl espere un valor lógico.
Por ejemplo en el módulo Set::Scalar::Base debido a Jarkko Hietaniemi y que proporciona acceso al álgebra de conjuntos vemos la siguiente declaración:
use overload '+' => \&_union_overload, '*' => \&_intersection_overload, '-' => \&_difference_overload, 'neg' => \&_complement_overload, '%' => \&_symmetric_difference_overload, '/' => \&_unique_overload, 'eq' => \&is_equal, '==' => \&is_equal, '!=' => \&is_disjoint, '<=>' => \&compare, '<' => \&is_proper_subset, '>' => \&is_proper_superset, '<=' => \&is_subset, '>=' => \&is_superset, 'bool' => \&size;Obsérvese como el manipulador para
bool
hace que
un conjunto en un contexto lógico devuelva su tamaño (\&size
).
El siguiente ejemplo que usa Set::Scalar
ilustra este punto. Consideremos el
programa:
$ cat ./scalar_sets2.pl #!/usr/local/bin/perl5.8.0 -d use Set::Scalar; $A = Set::Scalar->new('a'..'z'); print "$A\n" if $A;Al ejecutarlo podemos contemplar como se llama a
&size
para evaluar la condición if $A
:
$ ./scalar_sets2.pl Loading DB routines from perl5db.pl version 1.19 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. main::(./scalar_sets2.pl:4): $A = Set::Scalar->new('a'..'z'); DB<1> n main::(./scalar_sets2.pl:6): print "$A\n" if $A; DB<1> s Set::Scalar::Base::size(/usr/local/lib/perl5/site_perl/5.8.0/Set/Scalar/Base.pm:123): 123: my $self = shift;El comando
T
nos permite ver la pila de llamadas:
DB<1> T $ = Set::Scalar::Base::size(ref(Set::Scalar), undef, '') called from file `./scalar_sets2.pl' line 6 DB<1> Set::Scalar::Base::size(/usr/local/lib/perl5/site_perl/5.8.0/Set/Scalar/Base.pm:125): 125: return scalar keys %{ $self->{'elements'} }; DB<1> c (a b c d e f g h i j k l m n o p q r s t u v w x y z)
Casiano Rodríguez León