2011-01-18 8 views
5

Poznałem Perla już od jakiegoś czasu i stwierdziłem, że różni się on od innych języków OOP, które znam. próbowałem przetłumaczyć kod C#, który brzmi tak:Czy istnieje jakaś funkcja w Perlu podobna do GetType() w C#?

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

i metoda (pseudokod):

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

jak mogę napisać to w Perl bez funkcji gettype czy jest tam ktoś?

+8

Niezależnie od języka, robienie rzeczy w ten sposób zamiast Polimorfizm jest zły OOP. – aschepler

Odpowiedz

11

W wielu kodach Perla, operator ref jest tym, czego potrzebujesz, jeśli szukasz dokładnej nazwy klasy obiektu. Ponieważ jest niezdefiniowana, jeśli wartość nie jest odniesieniem, musisz sprawdzić wartość przed użyciem porównania ciągów.

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

Jest bardziej prawdopodobne, że chcesz coś podobnego is operatora C# 's. Byłaby to metoda , która jest dziedziczona przez wszystkie obiekty. Przykładem z doc na 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

fajnie! 'isa' znacznie bliżej GetType. – hometoast

Powiązane problemy