2009-05-26 14 views

Trả lời

20

Nếu bạn có một gói phần mềm được gọi là Foo, điều này sẽ làm điều đó:

no strict 'refs'; 
for(keys %Foo::) { # All the symbols in Foo's symbol table 
    print "$_\n" if exists &{"Foo::$_"}; # check if symbol is method 
} 
use strict 'refs'; 

Ngoài ra, để có được một danh sách của tất cả các phương pháp:

no strict 'refs'; 
my @methods = grep { defined &{$_} } keys %Foo::; 
use strict 'refs'; 
+3

Nên recurse xuống các mảng @ISA cũng như – Beano

+0

Kiểm tra điều này trên XML :: Simple, Scalar :: Util và Exporter hiển thị tất cả các phương thức được xuất khẩu rõ ràng. Tuy nhiên, việc đệ quy xuống @ISA không phải là điều khó khăn. –

+3

Tất nhiên, bạn sẽ gặp khó khăn trong việc tìm các phương thức được nạp tự động. – innaM

35

Có (chứ không phải quá) nhiều cách để làm điều này trong Perl vì có rất nhiều cách để làm việc trong Perl. Như ai đó đã nhận xét, các phương pháp được tải tự động sẽ luôn có một chút khó khăn. Tuy nhiên, thay vì lăn cách tiếp cận của riêng bạn, tôi sẽ đề nghị bạn hãy xem Class::Inspector trên CPAN. Điều đó sẽ cho phép bạn làm điều gì đó như:

my @methods = Class::Inspector->methods('Foo::Class', 'full', 'public'); 
+2

Cuối cùng tôi đã bao gồm nội tuyến Class :: Inspector trong kịch bản một tập tin của tôi, đó thực sự là giải pháp đơn giản hơn. Cảm ơn. –

+2

Lưu ý rằng Class :: Inspector có những hạn chế. Nó có thể thấy các phương thức đã định nghĩa, nhưng không xử lý bất cứ thứ gì trong UNIVERSAL. –

+2

Nó không giống như câu trả lời được chấp nhận xử lý UNIVERSAL ... – ephemient

12

nếu bạn có một gói phần mềm được sử dụng Moose của nó một cách hợp lý đơn giản:

print PackageNameHere->meta->dump; 

Và đối với dữ liệu đầy đủ hơn:

use Data::Dumper; 
print Dumper(PackageNameHere->meta); 

sẽ nhận được bạn đã bắt đầu. Đối với mọi thứ khác, theres các phương pháp mà xuất hiện trên ->meta mà được diễn tả trong Class::MOP::Class

Bạn có thể làm một chút về ADHOC giả mạo lòi của sự tốt lành moose đối với các gói mà không có nó với:

use Class::MOP::Class; 
my $meta = Class::MOP::Class->initialize(PackageNameHere); 

và sau đó tiếp tục sử dụng các Class :: MOP phương pháp như bạn sẽ với Moose.

Đối với người mới bắt đầu:

$meta->get_method_map(); 

sử dụng Moose; #, số tuyệt vời.

+1

khởi tạo sẽ trả về metaclass nếu nó được lưu trong bộ nhớ cache, không cần phải kiểm tra nó theo cách thủ công, xem ví dụ việc triển khai cho tất cả đường trong Moose.pm – perigrin

+1

Hmm và với điều tra thêm, tôi có vẻ đúng và sai. Class :: MOP :: class_of() sẽ xử lý các cá thể cũng như các tên lớp, trong khi hàm khởi tạo sử dụng (Class :: MOP :: get_metaclass_by_name()) * chỉ * xử lý các tên lớp. – perigrin

+0

Kent - điều này không hiệu quả đối với tôi - có thể có gì đó đã thay đổi trong thế giới Moose. Tôi có một ý chính ở đây: https://gist.github.com/rjattrill/6119205 –

4

Nói chung, bạn không thể làm điều này bằng ngôn ngữ động như Perl. Gói này có thể định nghĩa một số phương thức mà bạn có thể tìm thấy, nhưng nó cũng có thể tạo nên các phương thức khi không có định nghĩa cho đến khi bạn sử dụng chúng. Ngoài ra, thậm chí gọi một phương thức (hoạt động) có thể không xác định được nó. Đó là loại thứ làm cho ngôn ngữ động trở nên tốt đẹp. :)

Bạn đang cố gắng giải quyết nhiệm vụ nào?

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