2010-10-02 14 views
14

Jestem przyzwyczajony do pracy w Javie, więc może to pytanie jest zorientowanym na Javę pytaniem Perla ... w każdym razie, stworzyłem pakiet Person przy użyciu Moose.Jak zdefiniować "statyczne" podprogramy w Perlu?

Teraz chciałbym dodać kilka podprogramów, które są "statyczne", to znaczy nie odnoszą się do konkretnego Person, ale nadal są blisko związane z pakietem Person. Na przykład: sub sort_persons otrzymuje tablicę obiektów Person.

W języku Java po prostu zadeklarowałbym takie funkcje, jak static. Ale w Perlu ... jaki jest wspólny sposób na zrobienie tego?

p.s. Myślę, że terminologia Perlish, o której mówię, to "metody klasy".

+0

@FM że był dokładnie mój sposób myślenia. Zobacz mój komentarz do eugene y :) –

Odpowiedz

16

Nie ma czegoś takiego jak statyczna metoda w Perlu. Metody mające zastosowanie do całej klasy są tradycyjnie nazywane metodami klasy . Są one odróżniane tylko od metod instancji według typu ich pierwszego argumentu (który jest nazwą pakietu, a nie obiektem). Metody konstruktorów, takie jak new() w większości klas Perla, są częstym przykładem metod klasowych.

Jeśli chcesz szczególny sposób powoływać jako metoda klasy tylko, zrób coś takiego:

sub class_method { 
    my ($class, @args) = @_; 
    die "class method invoked on object" if ref $class; 
    # your code   
} 
+0

+1 Właśnie "znalazłem" o tym samemu :) Domyślam się, że najczęstszym przykładem jest 'new()', o którym nigdy nie myślałem w terminach 'static', ale oczywiście jest. –

+0

Jeśli nie ma powodu, dla którego metoda wywoływania obiektu byłaby szkodliwa, po prostu pominąłbym opcję 'ref $ self'. – cjm

+2

Aby odróżnić metody klas od metod obiektowych, lubię używać '$ class' jako zmiennej przechowującej invocanta. Tak więc 'sub class_method {my ($ class, @params) = @_; # blah} ' – daotoad