Say Critter es una subclase que no define find
o display
-o ambos! La correspondencia no es uno a uno porque las sub llamadas cableadas no realizan búsquedas de métodos, como explica la documentación de perlobj.
¿Cómo sabe Perl en qué paquete está la subrutina? Al mirar el lado izquierdo de la flecha, que debe ser un nombre de paquete o una referencia a un objeto, es decir, algo que ha sido bendecido con un paquete. De cualquier manera, ese es el paquete donde Perl comienza a buscar. Si ese paquete no tiene una subrutina con ese nombre, Perl comienza a buscarlo en cualquier clase base de ese paquete, y así sucesivamente.
Con un sub, tiene que saber exactamente dónde está estáticamente, o su programa será die
. Para llamar a un método, solo necesita especificar dónde comenzar a buscarlo.
Por ejemplo:
#! /usr/bin/env perl
package Critter;
sub new { bless {}, shift }
sub display { ref($_[0]) . " display" }
package SuperCritter;
@SuperCritter::ISA = qw/ Critter /;
package main;
my $super = SuperCritter->new;
# one of these things is not like the other
warn $super->display;
warn Critter::display($super);
warn SuperCritter::display($super);
Salida:
SuperCritter display at ./call-demo line 14.
SuperCritter display at ./call-demo line 15.
Undefined subroutine &SuperCritter::display called at ./call-demo line 16.
"dejando a un lado la comprobación de errores para asegurarse de que el primer parámetro es un objeto bendito o un nombre de clase válido" - que es algo muy importante propiedad para estar dejando de lado, ¿no? – Mat
@Mat - Correcto. Lo dejé fuera debido a su obviedad, no por falta de importancia. – DVK