我试图在Perl 6中感到舒服。当我在REPL提示符时,我在Python中发现的一件事就是我可以做一个dir(对象)并找出一个对象的属性,在Python中包含对象的方法。
这通常有助于提醒我想做什么; “噢,没错,Python中的修剪被称为strip',就是这样。”
在Perl 6中,我知道内省方法.WHO,.WHAT,.WHICH,.HOW和.WHY,但这些是在类或对象级别。如何找出对象内部的内容,以及我可以对其做些什么?
答案 0 :(得分: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'
>
查询对象的元对象有一个快捷方式;
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)
>
你可以找到更多here(这个答案的所有内容都来自哪里)。