Perl 6是否与Python的dir()相当?

Ste*_*ner 16 introspection perl6 raku

我正试图在Perl 6中感到舒服.当我在REPL提示符下时,我在Python中发现的一件事就是我可以做一个dir(对象)并找出一个对象的属性,在Python中包含对象的方法.

这通常有助于提醒我想做什么; "哦,这是正确的,Python中的修剪被称为条带",就像那样.

在Perl 6中,我知道内省方法.WHO,.WHAT,.WHICH,.HOW和.WHY,但这些是在类或对象级别.我如何找出对象内部的内容,以及我可以对它做些什么?

Mar*_*rty 12

我如何找出对象内部的内容,以及我可以对它做些什么?

您提到您已经了解了内省方法 - 但是您是否了解通过查询对象元对象(可从.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'
>
Run Code Online (Sandbox Code Playgroud)

查询对象的元对象有一个快捷方式; a.^b translates to a.HOW.b(a).Article的方法和属性本身就是对象 - Method和的实例Attribute.每当你调用.say一个对象时,你都隐式调用它的.gist方法,这个方法是为了给你一个对象的汇总字符串表示 - 即它的'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)
>
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到我们的更多信息(这个答案来自哪里).

  • 而不是`.map:*.name`,你也可以使用`>>.name` (5认同)