2011-09-26 22 views
9

tengo una referencia de objeto y podría ser una referencia a un objeto de tipo '' FooInvalidResultsnombre de clase de un objeto en Perl

Hay un archivo llamado FooInvalidResults.pm y hay una línea de 'FooInvalidResults paquete' en eso.

hará el siguiente trabajo?

my $class = blessed $result; 
if ($class eq 'FooInvalidResults') { 
    # do something 
} else { 
    # do something else 
} 

Respuesta

1

¿Por qué no usaste UNIVERSAL::isa?

if UNIVERSAL::isa($result, "FooInvalidResults") { 
    ... 
} 

Este fue un mal consejo , por favor utilice

$obj->isa('FooInvalidResults'); 

no estaba lleno consciente de la diferencia entre la llamada de subrutina (BAD) y el método de llamada (bueno), pero se hizo evidente después de Hice algunos RTFM yo mismo (perldoc UNIVERSAL). Gracias (y +1) a todas las personas que señalaron mi culpa.

+1

No aconseje a nadie que use UNIVERSAL :: ISA. Si alguien sabe, cuando es peligroso usarlo, no le preguntaría ... –

+1

@JanHartung Roger. No sabía que 'UNIVERSAL :: isa' era una bomba de tiempo. Tal vez no he abusado de 'isa' lo suficiente como para meterme en problemas. –

+0

$ obj-> isa no funciona cuando quiero garantizar que un objeto sea miembro de la superclase y no miembro de alguna subclase. –

15

La comparación de cadenas de nombres de clase es generalmente una mala idea, porque rompe el polimorfismo basado en subtipos, y porque generalmente no es bueno OO ser tan curioso acerca de detalles íntimos de un objeto como su nombre exacto de paquete.

En su lugar, escriba $result->isa('FooInvalidResults') - o, si es paranoico sobre la posibilidad de que $result no sea un objeto en absoluto, blessed $result && $result->isa('FooInvalidResults').

Usando UNIVERSAL::isa es una mala idea porque algunos objetos (por ejemplo, objetos simulados para realizar pruebas) tienen razones legítimas para reemplazar el método isa, y llamando UNIVERSAL::isa rompe esa.

+0

En su opinión, ¿'UNIVERSAL :: isa' siempre es una mala idea, o puede ser una solución viable para casos simples? –

+0

@MarcoDeLellis si hay casos en los que tiene sentido usarlos, definitivamente no son * simples *. Puede tener sentido al escribir un mro personalizado o algo así, pero nunca debe usarse para fines ordinarios. – hobbs

0

También es posible hacer el trabajo con la ref() orden interna en lugar de Scalar::Util::blessed():

$ perl -E '$ref = {}; bless $ref => "Foo"; say ref $ref' 
Foo 

Tenga en cuenta que si la referencia no es bendecido, esto devolverá el tipo de referencia:

$ perl -E '$ref = {}; say ref $ref' 
HASH 

Sin embargo, como han mencionado otros, UNIVERSAL::isa es una mejor solución.

+1

¡No aconseje a nadie que use UNIVERSAL :: ISA! Si alguien sabe, cuando es peligroso usarlo, él no preguntaría ... –

Cuestiones relacionadas