2017-05-30 15 views
7

Trong Perl5 và Moose, isa tuyến tính hoặc isa tuyến tính giúp hiểu rõ về phân cấp lớp.Làm thế nào để bạn hiển thị thứ bậc kiểu của một giá trị?

Phương pháp WHAT cho thấy các loại bê tông của một giá trị:

> 42.WHAT 
(Int) 

Làm thế nào để hiển thị một cái gì đó giống như

> 42.hypothetical-type-hierarchy 
(Int) ┬ is (Cool) ─ is (Any) ─ is (Mu) 
     └ does (Real) ─ does (Numeric) 

... có thể với dòng thêm cho mỗi vai trò tiêu thụ?


chỉnh sửa: ví dụ với hai sợi vai trò

class Beta {} 
role Delta {} 
role Gamma does Delta {} 
role Eta {} 
role Zeta does Eta {} 
role Epsilon does Zeta {} 
class Alpha is Beta does Gamma does Epsilon {} 

# (Alpha) ┬ is (Beta) 
#   ├ does (Gamma) ─ does (Delta) 
#   └ does (Epsilon) ─ does (Zeta) ─ does (Eta) 

my $ai = Alpha.new 
$ai.^mro  # ((Alpha) (Beta) (Any) (Mu)) 

$ai.^roles  # ((Epsilon) (Zeta) (Eta) (Gamma) (Delta)) 
       # flat list, not two-element list of a tuple and triple‽ 
+1

'.WHAT' doesn 't _show_ bất cứ điều gì, nó cung cấp cho bạn đối tượng kiểu. Mà cho các loại mà không có bất kỳ '::' trong chúng '.gist' vào một cái gì đó nửa chừng hợp lý. Bạn thực sự nên gọi '.^Name'. –

Trả lời

8

Bạn có thể truy vấn các đối tượng meta với

> 42.^mro 
((Int) (Cool) (Any) (Mu)) 

nơi mro đứng cho phương pháp để giải quyết

> 42.^roles 
((Real) (Numeric)) 

Bạn có thể kiểm soát vai trò nào được trả về thông qua các trạng từ :local (loại trừ vai trò được thừa kế từ lớp cha) - chỉ có sẵn trên lớp) và :!transitive (loại trừ vai trò được tạo thành qua vai trò khác - có sẵn trên cả vai trò và lớp).


Sau đây sẽ giúp bạn bắt đầu:

my $depth = 0; 
for Alpha.^mro { 
    say "is {.^name}"; 
    (sub { 
     ++$depth; 
     for @_ { 
      say ' ' x $depth ~ "does {.^name}"; 
      &?ROUTINE(.^roles(:!transitive)); # recursive call of anon sub 
     } 
     --$depth; 
    })(.^roles(:local, :!transitive)); 
} 

Với mã ví dụ của bạn với những thay đổi nhẹ

role Delta {} 
role Gamma does Delta {} 
role Eta {} 
role Zeta does Eta {} 
role Epsilon does Zeta {} 
class Beta does Gamma {} 
class Alpha is Beta does Gamma does Epsilon {} 

nó tạo ra sản lượng

is Alpha 
    does Epsilon 
    does Zeta 
     does Eta 
    does Gamma 
    does Delta 
is Beta 
    does Gamma 
    does Delta 
is Any 
is Mu 
+0

Xin lỗi, tôi không hiểu phần trạng từ. Bạn có thể minh họa bằng ví dụ thứ hai trong bài đăng đã chỉnh sửa của tôi không? – daxim

+1

@daxim An [adverb] (https://docs.perl6.org/language/glossary#Adverb) là một đối số được đặt tên làm thay đổi chức năng của một hàm. Ví dụ: chuyển ':! Transitive' sẽ loại bỏ các vai trò là' does'd [transitively] (http://www.dictionary.com/browse/transitively). ('!' Có nghĩa là "không", nghĩa là ':! Transitive' tương tự với cụm từ tiếng Anh" không quá ") Vì vậy, hãy nói $ ai.^Vai trò (:! Transitive)' với mã của bạn chỉ hiển thị '((Epsilon) (Gamma)) '. – raiph

+1

Điều này giống như một mô-đun tiện ích tốt đẹp trong hệ sinh thái. *gợi ý* :-) –

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