Ответ 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)
>
Здесь вы можете найти более здесь (здесь и было всего около всего для этого ответа).