Es por esto que, para operaciones no conmutativas como la resta o la divisón, la función de implementación suele comenzar asi:
sub bsub { my ($op1, $op2, $reversed) = @_; ($op1, $op2) = ($op2, $op1) if $reversed; if (UNIVERSAL::isa($op1, 'Math::BigFloat') { ... # $op1 es un objeto } ... }Veamos otro ejemplo, en el que el objeto esta a la derecha y a la izquierda tenemos una constante:
$ cat ./bigfloat3.pl #!/usr/bin/perl -d use strict; use Math::BigFloat; my $a = Math::BigFloat->new('123_456_789_123_456_789'); print "123_456_789_123_456_789-a = ",'123_456_789_123_456_789'-$a,"\n";Al ejecutar, tenemos:
$ ./bigfloat3.pl main::(./bigfloat3.pl:5): my $a = Math::BigFloat->new('123_456_789_123_456_789'); DB<1> n main::(./bigfloat3.pl:7): print "123_456_789_123_456_789-a = ",'123_456_789_123_456_789'-$a,"\n"; DB<1> s Math::BigInt::CODE(0x82f997c)(/usr/share/perl5/Math/BigInt.pm:47): 47: '-' => sub { my $c = $_[0]->copy; $_[2] ? 48: $c->bneg()->badd($_[1]) : 49: $c->bsub( $_[1]) }, DB<1> p "@_" 123456789123456789 123_456_789_123_456_789 1Vemos como el tercer argumento esta a
1
y como la subrutina anónima
que trata el caso del menos binario convierte la expresión $a-$b
en (-$b)+$a
en el caso en que el objeto es el segundo término.
Continuamos la ejecución:
DB<2> c 123_456_789_123_456_789-a = 0 Debugged program terminated. Use q to quit or R to restart, use O inhibit_exit to avoid stopping after program termination, h q, h R or h O to get additional info.Observe que, en general se espera que los operadores sobrecargados puedan manejar la operación de números y objetos de la clase como en
4+$a
. Por tanto nuestro código debe manipular no solo
la operación de objetos sino también la de objetos y números. El ejemplo anterior del método
substract
, a través del uso del método UNIVERSAL::isa
(véase sección 6.6) muestra una forma de hacerlo.
Casiano Rodríguez León