next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: CGI Sup: Sobrecarga de Operadores Ant: Constructor de copia Err: Si hallas una errata ...


Ejercicio: Sobrecarga de Operadores

Considere el siguiente programa:
$ cat -n ./fractions2.pl
1  #!/usr/local/bin/perl5.8.0  -w
2  use Number::Fraction ':constants';
3
4  my $t = '1/2';
5  my $x = $t;
6  $t += '1/2';
7  print "t=$t, ref(t)=",ref($t),"\n";
8  print "x=$x, ref(x)=",ref($x),"\n";
Al ejecutarlo, produce la siguiente salida:
$ ./fractions2.pl
t=1/1, ref(t)=Number::Fraction
x=1/2, ref(x)=Number::Fraction
¿Porqué la asignación de la línea 5 ($x = $t) no parece comportarse como una asignación de referencias como se señaló en la sección anterior?. La modificación de $t no produce un efecto lateral sobre $x. Nótese que el operador = no ha sido sobrecargado en Number::Fraction. Puede comprobarlo en el listado de la cabecera de Number::Fraction que aparece en la sección 7.8.6.

Para ayudar a entender lo que esta ocurriendo, aqui tiene el código del método add que sobrecarga el operador +

sub add {
  my ($l, $r, $rev) = @_;

  if (ref $r) {
    if (UNIVERSAL::isa($r, ref $l)) {
      return (ref $l)->new($l->{num} * $r->{den} + $r->{num} * $l->{den},
			   $r->{den} * $l->{den});
    } else {
      croak "Can't add a ", ref $l, " to a ", ref $l;
    }
  } else {
    if ($r =~ /^[-+]?\d+$/) {
      return $l + (ref $l)->new($r, 1);
    } else {
      return $l->to_num + $r;
    }
  }
}


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: CGI Sup: Sobrecarga de Operadores Ant: Constructor de copia Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21