2010-10-02 5 views
14

Sono abituato a lavorare in Java, quindi forse questa domanda è una domanda Perl Java-oriented ... in ogni caso, ho creato un pacchetto di Person utilizzando Moose.Come definire le subroutine "statiche" in Perl?

Ora, vorrei aggiungere alcune subroutine che sono "statiche", cioè non si riferiscono a uno specifico Person, ma sono ancora strettamente correlate al pacchetto Person. Ad esempio, sub sort_persons ottiene una matrice di oggetti Person.

In Java, vorrei semplicemente dichiarare tali funzioni come static. Ma in Perl ... qual è il modo comune per farlo?

p.s. Penso la terminologia la Perl per quello che sto facendo riferimento alla è "metodi di classe".

+0

@FM quella era esattamente la mia linea di pensiero. Vedi il mio commento a eugene y :) –

risposta

16

Non c'è cosa come un metodo statico in Perl. I metodi che si applicano a tutta la classe sono convenzionalmente chiamati metodi di classe. Questi sono distinti da metodi di istanza per il tipo del primo argomento (che è un nome di pacchetto, non un oggetto). I metodi di costruzione, come new() nella maggior parte delle classi Perl, sono un esempio comune di metodi di classe.

Se si desidera un particolare metodo da richiamare come metodo di classe solo, fare qualcosa di simile:

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

+1 Ho appena "trovato" su di esso me stesso :) Immagino che l'esempio più comune sia 'new()' che non ho mai pensato in termini di 'statico' ma ovviamente lo è. –

+0

A meno che non ci sia una qualche ragione per cui sarebbe male che il metodo di classe venga chiamato su un oggetto, vorrei semplicemente saltare "ref $ self". – cjm

+2

Per aiutare a distinguere i metodi di classe dai metodi degli oggetti, mi piace usare '$ class' come variabile che contiene il richiamo. Quindi 'sub class_method {my ($ class, @params) = @_; # blah} ' – daotoad