2010-10-02 32 views
14

Tôi đã từng làm việc trong Java, vì vậy có lẽ câu hỏi này là một câu hỏi Perl theo định hướng Java ... dù sao, tôi đã tạo một gói Person sử dụng Moose.Tôi nên định nghĩa chương trình con 'tĩnh' trong Perl như thế nào?

Bây giờ, tôi muốn thêm một vài chương trình con "tĩnh", nghĩa là chúng không tham chiếu đến Person cụ thể, nhưng vẫn liên quan chặt chẽ đến gói Person. Ví dụ: sub sort_persons nhận một mảng gồm Person đối tượng.

Trong Java, tôi chỉ cần khai báo các hàm như static. Nhưng trong Perl ... cách phổ biến để làm điều đó là gì?

p.s. Tôi nghĩ thuật ngữ Perlish cho những gì tôi đang đề cập đến là "phương thức lớp".

+0

@FM đó là chính xác những dòng của tôi về suy nghĩ. Xem bình luận của tôi cho eugene y :) –

Trả lời

16

Không có phương pháp tĩnh như vậy trong Perl. Các phương thức áp dụng cho toàn bộ lớp học thường được gọi là phương thức lớp . Chúng chỉ được phân biệt với các phương thức mẫu theo loại đối số đầu tiên của chúng (là tên gói, không phải là đối tượng). Các phương thức xây dựng, như new() trong hầu hết các lớp Perl, là một ví dụ phổ biến của các phương thức lớp.

Nếu bạn muốn có một phương pháp cụ thể được gọi là một phương pháp học chỉ, làm một cái gì đó như thế này:

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

+1 Tôi chỉ "tìm thấy" về nó bản thân mình :) Tôi đoán ví dụ phổ biến nhất là 'new()' mà tôi chưa bao giờ nghĩ về 'tĩnh' nhưng rõ ràng là nó. –

+0

Trừ khi có một số lý do tại sao nó sẽ là xấu cho phương pháp lớp được gọi trên một đối tượng, tôi sẽ chỉ bỏ qua kiểm tra 'ref $ tự'. – cjm

+2

Để giúp phân biệt các phương thức lớp từ các phương thức đối tượng, tôi thích sử dụng '$ class' làm biến chứa invocant. Vì vậy, 'sub class_method {my ($ class, @params) = @_; # blah} ' – daotoad

Các vấn đề liên quan