La Referencia no es el Objeto

El hash referenciado por $paper en las líneas de la 6 a la 13 es bendecido en la línea 15 con el nombre de la clase.

 1 sub new {
 2   my $class = shift;
 3   my ($identifier, $author, $publisher, $title,  $year, $url) = @_;
 4   $class->_incr_count();
 5 
 6   my $paper = {
 7     _identifier      => $identifier,
 8     _author    => $author,
 9     _publisher => $publisher,
10     _title     => $title,
11     _year      => $year,
12     _url       => $url
13   };
14 
15   bless  $paper, $class;
16 }
Esto establece un campo interno dentro de la representación interna del hash anónimo. En cierto sentido es %$paper quien es bendecido, no $paper. La figura 6.1 ilustra este punto: En la izquierda de la figura aparecen la referencia y el referente antes de la bendición. En la parte de la derecha, después de ejecutar bless $paper, $class. Obsérvese que se ha añadido una marca con el nombre de la clase-paquete que identifica la estructura de datos como un objeto de esa clase.

Figura 6.1: Al bendecir un objeto este es marcado con la clase a la que pertenece
\begin{figure}\centerline{\epsfig{file=bless.eps, height=6cm}}\end{figure}

Una vez que el dato apuntado por la referencia ha sido bendecido, el operador ref aplicado a dicha referencia devuelve el nombre del paquete (esto es, el nombre de la clase) en vez de HASH.

Una comprobación de que quien es bendecido es el dato referido no la referencia la da el siguiente código:

$obj = new Biblio::Doc(1, "Asimov", "Bruguera", 
   "Los propios dioses", 1989, "unknown");
$obj2 = $obj;
print "obj2 es un ",ref($obj2),"\n";

Se imprimirá que obj2 es un Biblio::Doc

La función reftype en Scalar::Util permite obtener el tipo básico subyacente al objeto:

  DB<1> use Scalar::Util qw{reftype}
  DB<2> $x = bless {}, 'SomeClass'
  DB<3> p ref($x)
SomeClass
  DB<4> p reftype($x)
HASH

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19