2016-04-01 9 views
14

Próbuję poczuć się komfortowo w Perlu 6. Jedną z rzeczy, które znalazłem pod ręką w Pythonie, gdy byłem na wezwaniu REPL, było to, że mogłem wykonać dir (obiekt) i dowiedzieć się atrybutów obiektu, który w Python zawiera metody obiektu.Czy Perl 6 ma odpowiednik dir() Pythona?

To często służyło jako pomocne przypomnienie tego, co chciałem zrobić; "Och, zgadza się, przycinanie w Pythonie nazywa się" paskiem ", tego rodzaju rzeczy.

W Perlu 6, wiem o metodach introspekcji .WHO, .WHAT, .WHICH, .HOW i .WHY, ale są one na poziomie klasy lub obiektu. Jak mogę się dowiedzieć, co znajduje się w obiekcie i co mogę zrobić?

Odpowiedz

11

Jak mogę się dowiedzieć, co znajduje się w obiekcie i co mogę zrobić?

Wspomniał Pan, że już wiesz o metodach introspekcji - ale czy wiesz o tym, czego możesz się dowiedzieć, wyszukując metaobiekt obiektów (dostępny z .HOW)?

$ perl6 
> 
> class Article { 
* has Str $.title; 
* has Str $.content; 
* has Int $.view-count; 
* } 
> 
> my Str $greeting = "Hello World" 
Hello World 
> 
> say Article.^methods 
(title content view-count) 
> 
> say Article.^attributes 
(Str $!title Str $!content Int $!view-count) 
> 
> say $greeting.^methods 
(BUILD Int Num chomp chop pred succ simplematch match ords samecase samemark 
samespace word-by-word trim-leading trim-trailing trim encode NFC NFD NFKC NFKD 
wordcase trans indent codes chars uc lc tc fc tclc flip ord WHY WHICH Bool Str 
Stringy DUMP ACCEPTS Numeric gist perl comb subst-mutate subst lines split words) 
> 
> say $greeting.^attributes 
Method 'gist' not found for invocant of class 'BOOTSTRAPATTR' 
> 

Istnieje skrót do sprawdzania metaobiektu obiektu; a.^b translates to a.HOW.b(a). Metody i atrybuty dla samego artykułu są obiektami - instancjami Method i. Za każdym razem, gdy wywołujesz obiekt .say, niejawnie wywołujesz jego metodę .gist, która ma na celu uzyskanie podsumowanej ciągi reprezentującej obiekt - tj. "Jego" istotę.

Atrybuty wbudowanym Str typu wydaje się być typu BOOTSTRAPATTR typ - który nie implementuje metodę .gist. Jako alternatywę możemy po prostu poprosić o atrybuty wypluwania ich nazw;

> say sort $greeting.^methods.map: *.name ; 
(ACCEPTS BUILD Bool DUMP Int NFC NFD NFKC NFKD Num Numeric Str Stringy WHICH WHY 
chars chomp chop codes comb encode fc flip gist indent lc lines match ord ords perl 
pred samecase samemark samespace simplematch split subst subst-mutate succ tc tclc 
trans trim trim-leading trim-trailing uc word-by-word wordcase words) 
> 
> say sort $greeting.^attributes.map: *.name 
($!value) 
> 

można znaleźć nasze więcej here (czyli tam, gdzie prawie wszystko dla tej odpowiedzi pochodzi).

+1

Dziękuję. Nie zdawałem sobie sprawy z tego, co widzę, kiedy zadzwoniłem. HOW. Mógłbym mgliście przypomnieć sobie składnię ". ^", Ale nie mogłem wymyślić, jak dowiedzieć się, jakie metody obsługuje, aby dowiedzieć się, co mogę nazwać! :-) –

+5

zamiast '.map: * .name', możesz także użyć' >> .name' – Christoph

Powiązane problemy