Имеет ли Perl 6 эквивалент Python dir()?

Я пытаюсь стать комфортным в Perl 6. Одна из вещей, которые я нашел удобной в Python, когда я был в приглашении REPL, заключалась в том, что я мог бы сделать dir (object) и узнать атрибуты объекта, который в Python включает методы объекта.

Это часто служило полезным напоминанием о том, что я хотел сделать; "О, это правильно, обрезать в Python называется strip", что-то типа.

В Perl 6 я знаю о методах интроспекции .WHO,.WHAT,.WHICH,.HOW и .WHY, но они находятся на уровне класса или объекта. Как узнать, что внутри объекта, и что я могу с ним сделать?

Ответы

Ответ 1

Как узнать, что внутри объекта, и что я могу с ним сделать?

Вы упомянули, что уже знаете методы интроспекции, но знаете ли вы, что вы можете узнать, запросив метаобъект объектов (доступный из .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'
>

Существует ярлык для запроса метаобъекта объекта; a.^b translates to a.HOW.b(a). Методы и атрибуты для Статьи сами являются объектами - экземплярами Method и Attribute. Всякий раз, когда вы вызываете .say на объект, вы неявно вызываете его метод .gist, который должен дать вам обобщенное строковое представление объекта - т.е. Его смысл.

Атрибуты встроенного типа Str выглядят как тип BOOTSTRAPATTR, который не реализует метод .gist. В качестве альтернативы мы можем просто попросить атрибуты выплевывать свои имена вместо этого;

> 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)
>

Здесь вы можете найти более здесь (здесь и было всего около всего для этого ответа).