2009-07-17 17 views
16

¿Cuál es la diferencia entre paquete, módulo y clase en Perl orientado a objetos?¿Cuál es la diferencia entre paquete, módulo y clase en Perl orientado a objetos?

+2

Antes de hacer este tipo de preguntas, intente leer primero la documentación de Perl. Si no comprende lo que está leyendo, haga preguntas al respecto. –

+1

¿Qué te hace estar tan seguro de que no tenía RTFM? – spoulson

+4

@spoulson: mira su historial de preguntas. Esto no es una excepción. –

Respuesta

24

Los módulos son un solo archivo, un archivo .pm que proporciona el código. Eso podría no ser paquetes, un solo paquete o más de un paquete. A un módulo realmente no le importa lo que contiene, por lo que puede ser un código que se inserte en el mismo espacio de nombres, un conjunto más tradicional de subrutinas en una biblioteca o definir la idea de una clase de Perl.

Un paquete, también conocido como espacio de nombres, contiene sus propias variables y subrutinas. Es una forma de segregar diferentes partes de tu programa. Crear el paquete y poner su código en él:

package SomePackage; 

sub some_subroutine { ... } # really SomePackage::some_subroutine 

Se carga el módulo para obtener acceso al paquete:

use SomePackage; # read and compile the module file 

SomePackage::some_subroutine(...); 

clase A Perl es un paquete y su comportamiento asociado. Los métodos en una clase son subrutinas simplemente normal, aunque cuando tratamos las subrutinas como métodos, el primer parámetro es la cosa (un nombre de paquete u objeto, también conocido como el referente) que llama al método:

package SomeClass; 

sub class_method { my($class, @args) = @_; ... } 
sub instance_method { my($self, @args) = @_; ... } 

Desde la clase es sólo un paquete como cualquier otro paquete, y probablemente vive en un módulo, se accede a él de la misma manera con use:

use SomeClass; 

my $i = SomeClass->class_method(...); 

la sintaxis OO flecha hace algunas cosas especiales para permitir que el some_method subrutina saber que es siendo llamado como un método. Perl pone el referente (el SomeClass en este caso) como primer argumento. Además, al usar la sintaxis de OO, Perl sabe usar sus características de herencia.

Métodos llamadas con '->' conseguir el referente como el primer parámetro del método, por lo que esta llamada:

SomeClass->new('world'); 

es sintácticamente el si hubiera llamado con el nombre de la clase como primer parámetro:

SomeClass::new('SomeClass' ,'world'); # no inheritance this way 

Eso funciona igual para los objetos también. Cuando un objeto es el referente:

my $i = SomeClass->new(); 
$i->bar('world'); 

el objeto es el primer parámetro como el método:

SomeClass::bar($i, 'world'); 
+0

Esa es una forma bastante indirecta de decir que Perl <6 no tiene clases ;-) – innaM

+0

Aunque, dicho esto, me gusta * ese comportamiento. Sin embargo, PHP se encargó principalmente de obtener esa forma de pensar, es decir, no tiene, (y nunca tendrá, (* pone los dedos en los oídos *)) compatibilidad con el espacio de nombres. –

+5

Los paquetes no son alcances. Tienen un alcance léxico, pero no definen un alcance. –

12

Perl no tiene clases. Tiene espacios de nombres que cambia con package. Para obtener los detalles completos de Perl OOP, consulte Intermedio Perl o Perl Orientado a objetos. También puede ver la documentación perltoot y perlboot. En resumen, Perl simula lo que la gente espera que sean las clases "reales" con paquetes, subrutinas normales y referencias.

Un módulo es un fragmento de código distribuible contenido en un archivo. Ver perlmod.


decir más sobre esto en mi post para The Effective Perler, Find a module's release managers. No entiendo las cosas de OO, pero hablo sobre los otros términos en torno al "módulo".

Cuestiones relacionadas