2011-01-18 16 views
5

Ho imparato un po 'il Perl ora e l'ho trovato molto diverso dalle altre lingue OOP che conosco. ho cercato di tradurre un codice C# che va come:Esiste qualche funzione in Perl simile a GetType() in C#?

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

e un metodo (pseudocodice):

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

Come faccio a scrivere questo in Perl, senza una funzione GetType o c'è uno?

+8

indipendentemente dalla lingua, fare le cose in questo modo, piuttosto che il polimorfismo è Bad OOP. – aschepler

risposta

11

In un sacco di codice Perl, l'operatore ref è ciò che si desidera se si sta cercando il nome esatto della classe dell'oggetto. Poiché non è definito se il valore non è un riferimento, è necessario controllare il valore prima di utilizzare il confronto tra stringhe.

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

E 'più probabile che si desidera qualcosa di simile is operatore C#' s. Quello sarebbe il metodo isa di UNIVERSAL che è ereditato da tutti gli oggetti. Un esempio dal doc presso 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

bello! 'isa' molto più vicino a GetType. – hometoast

Problemi correlati