Làm cách nào để liệt kê các phương thức có sẵn trên một đối tượng hoặc gói nhất định trong Perl?Làm cách nào để liệt kê các phương thức có sẵn trên một đối tượng hoặc gói nhất định trong Perl?
Trả lời
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';
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');
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. –
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. –
Nó không giống như câu trả lời được chấp nhận xử lý UNIVERSAL ... – ephemient
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.
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
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
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 –
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?
- 1. Làm cách nào để liệt kê các đối tượng có sẵn để tiêm vào grails?
- 2. Làm thế nào để liệt kê tất cả các phương thức cho một đối tượng trong Ruby?
- 3. Làm thế nào để bạn liệt kê các đối tượng hiện có sẵn trong phạm vi hiện tại trong ruby?
- 4. Liệt kê tất cả các gói có sẵn trên CRAN để bàn giao tiếp
- 5. Cách tốt nhất để liệt kê tất cả các codec video có sẵn trên Windows?
- 6. Liệu Perl có một kiểu liệt kê?
- 7. Làm cách nào để liệt kê các phương thức trong mô-đun Python 2.5?
- 8. Liệt kê tất cả các đối tượng của một lớp nhất định
- 9. Liệt kê các phương thức của một lớp trough mixin
- 10. Liệt kê các phông chữ có sẵn trong PHP
- 11. Làm cách nào để liệt kê các cam kết từ một số cam kết nhất định?
- 12. Tôi làm cách nào để liệt kê tất cả các biến nằm trong một phạm vi nhất định?
- 13. Trong groovy, có cách nào để kiểm tra xem một đối tượng có một phương thức nhất định không?
- 14. Có cách nào để liệt kê các biến có sẵn trong mẫu Ruby ERB không?
- 15. Làm thế nào để liệt kê các phương thức lớp trong gdb?
- 16. Làm cách nào để liệt kê tất cả các thuộc tính của một đối tượng trong pdb python?
- 17. PostgreSQL: Làm thế nào để liệt kê tất cả các kiểu dữ liệu có sẵn?
- 18. liệt kê các trường của đối tượng khéo léo
- 19. Làm cách nào để xuất phương thức S3 để nó có sẵn trong không gian tên?
- 20. Chuỗi Python để liệt kê các phương pháp hay nhất
- 21. Làm cách nào để đơn vị kiểm tra các phương thức trong đối tượng phương thức?
- 22. Làm cách nào để tự động gọi một phương thức trên một đối tượng động?
- 23. Tôi có thể liệt kê các thuật toán mã hóa có sẵn như thế nào?
- 24. Làm thế nào để liệt kê các dịch vụ cơ sở dữ liệu sẵn có (SQLSewrver hoặc Oracle hoặc MySQL hoặc PostgreSQL, vv) trong một mạng trong C#?
- 25. Liệt kê tất cả các hội đồng .NET có sẵn
- 26. Làm thế nào để liệt kê các đối tượng _all_ trong thùng chứa S3 của Amazon?
- 27. Làm cách nào để liệt kê tất cả các đối tượng được tạo từ một lớp trong Ruby?
- 28. Làm cách nào để liệt kê các biểu tượng trong một tệp .so
- 29. Làm cách nào để xác định phương thức nào được gọi trong phương thức?
- 30. Liệt kê các đối tượng đã xuất từ gói R mà không cần đính kèm nó
Nên recurse xuống các mảng @ISA cũng như – Beano
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. –
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