2011-01-18 651 views
5

He estado aprendiendo Perl por un tiempo y lo encontré muy diferente de otros lenguajes OOP que conozco. Me trataron de traducir un código C# que dice así:¿Hay alguna función en Perl similar a GetType() en C#?

class Car{}, class CarList{}, class Program{} 

y un método (pseudocódigo):

if (var.GetType() == Car) 
{ 
} 
else if (var.GetType == CarList) 
{ 
} 

¿Cómo se escribe esto en Perl y sin una función GetType o hay uno?

+8

sin importar el idioma, hacer las cosas de esta manera en lugar de polimorfismo es mala programación orientada a objetos. – aschepler

Respuesta

11

En muchos códigos Perl, el operador ref es lo que desea si busca el nombre exacto de la clase del objeto. Como no está definido si el valor no es una referencia, debe verificar el valor antes de usar comparaciones de cadenas.

if(ref $var) { 
    if(ref($var) eq 'Car') { 
     # ... 
    } elsif(ref($var) eq 'CarList') { 
     # ... 
    } 
} 

Es más probable que desea algo así como is operador de C# 's. Ese sería el método isa de UNIVERSAL heredado por todos los objetos. Un ejemplo del documento en http://perldoc.perl.org/UNIVERSAL.html:

use Scalar::Util 'blessed'; 

# Tests first whether $obj is a class instance and second whether it is an 
# instance of a subclass of Some::Class 
if (blessed($obj) && $obj->isa("Some::Class")) { 
    ... 
} 
+0

¡agradable! 'isa' mucho más cerca de GetType. – hometoast

Cuestiones relacionadas