内省:我们如何获得一个班级中的班级名称?

时间:2019-05-12 07:04:36

标签: metaprogramming perl6

说我们有

class Foo {}

是否可以从课堂中获取“ Foo”?

2 个答案:

答案 0 :(得分:9)

是的

class Foo {
    say ::?CLASS.^name; # OUTPUT: Foo
}

答案 1 :(得分:7)

Kaiepi的解决方案占有一席之地,下面我将介绍它,但同时请考虑:

class Foo {
    say Foo.perl;         # Foo
    say OUR.WHO;          # Foo
    ::?PACKAGE
}

Foo.perl

这为您的字面问题提供了一个简单的答案(尽管它忽略了您的真正想法,正如您在下面的评论中所解释的以及metaprogramming标签所建议的以及对“内省”一词的使用)

OUR.WHO

出于以下几个原因,我认为这通常比::?CLASS.^name更合适:

  • 行噪少。

  • 适用于所有种形式的包装,即使用内置声明符packagemodulegrammar或{{1 }}和role,以及actorclass等自定义声明符。

  • 如果读者调查OUR和/或.WHO,将会引导读者直接解决与之直接相关的问题,反之,如果读者调查the ::?... construct,会使读者分散注意力。

    < / li>

monitor::?CLASS

::?PACKAGE仅适用于 value 语法槽,而不适用于 type 语法槽。对于后者,您需要合适的OUR.WHO格式,例如:

::?...

这些class Foo { has ::?CLASS $bar } 形式也可以用作值:

::?...

因此,尽管它们相对丑陋,但在这种特定意义上它们更为笼统。就是说,如果普遍性很重要,那么class Foo { has $bar = ::?CLASS } 就更好了,因为它适用于所有形式的软件包。