next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Sobrecarga y herencia Sup: Sobrecarga de Operadores Ant: Propagación de la Sobrecarga Err: Si hallas una errata ...

Búsqueda de la Implementación de un Operador

Normalmente la implementación de un operador sobrecargado se busca en el siguiente orden:
  1. Si el operador ha sido explícitamente sobrecargado se llama a la correspondiente subrutina
  2. Si no, se mira a ver si el mecanismo de propagación automático descrito en 7.8.1 puede ser aplicado
  3. En otro caso, se mira a ver si el seudo operador nomethod fué definido. Si es así se llama a la subrutina asociada con nomethod.
  4. En cualquier otro caso generar una excepción

Este orden puede alterarse si se define el seudo operador fallback.

Si fallback esta definido y es cierto, la secuencia es la misma que en el caso anterior, excepto que, en vez de generar una excepción, la operación pasa a implementarse siguiendo la conducta normal de Perl para ese operador:

  1. Si el operador ha sido explícitamente sobrecargado se llama a la correspondiente subrutina
  2. Si no, se mira a ver si el mecanismo de propagación automático descrito en 7.8.1 puede ser aplicado
  3. En otro caso, se mira a ver si el seudo operador nomethod fué definido. Si es así se llama a la subrutina asociada con nomethod
  4. Aplicar la conducta normal de Perl para ese operador

Si fallback esta definido pero es falso, el paso 2 es eliminado y la secuencia es:

  1. Si el operador ha sido explícitamente sobrecargado se llama a la correspondiente subrutina
  2. En otro caso, se mira a ver si el seudo operador nomethod fué definido. Si es así se llama a la subrutina asociada con nomethod.
  3. En cualquier otro caso generar una excepción

Este último orden proporciona un mecanismo para aquellas situaciones en las que se quiere evitar el proceso de propagación automática de la sobrecarga. Por ejemplo, supongamos que queremos sobrecargar la operación de diferencia entre días de la semana (lunes, martes, ...) de manera que podamos determinar el número de días entre las mismos. Parece que no tendría sentido usar el operador de negación unaria. Para ello podemos asociar con el operador neg una referencia a una subrutina que provoque una excepción:

package DaysOfTheWeek;
use overload
  "-"         =>  \delta,
  "nomethod"  =>  sub { croak "No tiene sentido negar un dia de la semana\n" };

Sin embargo, este método es ineficiente si el número de operadores autogenerados cuyo uso se quiere prohibir es grande. Una mejor solución es:

package DaysOfTheWeek;
use overload
  "-"         =>  \delta,
  "fallback"  =>       0,
  "nomethod"  =>  sub { croak "No tiene sentido $_[3]\n" };

Los argumentos que se pasan a la subrutina asociada con nomethod son:

  1. El primer operando
  2. El segundo operando (undef si no existe)
  3. Un flag indicando cuando los operandos fueron intercambiados
  4. El operador ``realmente'' solicitado ($_[3])


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