$d
y $t
son dos Math::BigFloat
. Una asignación como:
$v = $d/$t;trata a
$d
y $t
como valores en vez de como las referencias que son a los
correspondientes objetos. Consideremos una asignación como:
$v1 = $v;La asignación hace que
$v1
y $v
sean una referencia al mismo objeto. Si posteriormente incrementamos $v1
:
$v1++;tendremos un efecto lateral, ya que
$v
se ve incrementado.
Este efecto es, cuando menos, inconsistente con el uso normal de las operadores
sobrecargados, en el sentido de que estos ``trabajan'' los referentes (objetos)
y la asignación ``trabaja'' con las referencias.
Los operadores que cambian el valor de sus operandos se llaman ``mutantes''.
El módulo overload
proporciona un medio para interceptar a los mutantes
y clonar los objetos que están siendo mutados de manera que la mutación sólo
afecte a la copia del objeto. Esta intercepción se hace sobrecargando la operador
engañosamente denominado =
package Math::BigFloat; sub copy { Math::BigFloat->new(${$_[0]}) } use overload ... '++' => "incr", '=' => "copy";Esta sobrecarga no cambia la conducta del operador de asignación. La rutina
copy
es llamada antes que la subrutina asociada con cualqueir mutante.
Asi pues, el código:
$v1++;
Se traduce por:
$v1 = $v1->copy(undef,""); $v1->incr(undef,"");