2009-11-30 20 views

Respuesta

3

Eso depende. A veces, __PACKAGE__->method() es exactamente lo que necesita.

De lo contrario, es mejor usar ref($self)->class_method() o $self->method().

+1

Pero si planeas que tu clase sea heredada, es algo malo, ¿no? – Geo

+0

@Geo: depende. –

+0

Si '__PACKAGE__' es lo que necesita, debe usar eso. Podría ser un problema y debería verificar si obtiene los resultados que espera. –

9

Depende de lo que quieres hacer:

#!/usr/bin/perl 

package A; 

use strict; use warnings; 

sub new { bless {} => $_[0] } 

sub method1 { 
    printf "Hello from: %s\n", __PACKAGE__; 
} 

sub method2 { 
    my $self = shift; 
    printf "Hello from: %s\n", ref($self); 
} 

package B; 

use strict; use warnings; 
use parent 'A'; 

package main; 

my $b = B->new; 

$b->method1; 
$b->method2; 

Salida:

 
Hello from: A 
Hello from: B 
6

Si tiene la intención de heredar ese método, lo llaman en el referente y no se basan en el paquete lo encuentra. Si tiene la intención de llamar a un método interno del paquete que ningún otro paquete debería poder ver, entonces podría estar bien. Hay una explicación más completa en Intermediate Perl, y probablemente en perlboot (que es un extracto del libro).

En general, trato de no utilizar __PACKAGE__ a menos que esté escribiendo modulino.

¿Por qué está tratando de usar __PACKAGE__?

+0

Lo usé por conveniencia, por lo que no necesitaría obtener el nombre del paquete. – Geo

+6

Bien, pero ¿por qué intentas obtener el nombre del paquete? Probablemente no deberías estar haciendo eso sin importar cómo obtengas el nombre. –

3

"Depende". es la respuesta correcta. Es relativamente poco común realmente necesitar el nombre del paquete; por lo general, tendrá una instancia o un nombre de clase para comenzar. Dicho esto, hay momentos en los que realmente necesita el nombre del paquete: __PACKAGE__ es claramente la herramienta para ese trabajo, siendo superior a un literal. Aquí hay algunas pautas:

Nunca llame a métodos desde __PACKAGE__ dentro de métodos, ya que esto hace imposible que los herederos cambien su implementación simplemente anulando el método llamado. Use $self o $class en su lugar.

Trate de evitar __PACKAGE__ dentro de los métodos en general. Cada uso de __PACKAGE__ agrega un poco de inflexibilidad. A veces, la inflexibilidad es lo que desea (porque necesita resolución en tiempo de compilación o no quiere controlar dónde se almacena la información), pero esté triplemente seguro de que lo que quiere vale la pena el costo. Te agradecerás más tarde.

Fuera de los métodos, no tiene acceso a $self, y debe llamar a los métodos __PACKAGE__ en lugar de un literal. Esto es principalmente importante para las declaraciones en tiempo de compilación como las proporcionadas por Class::Accessor.

Cuestiones relacionadas