自省:我们如何在class中获取class的名称?

Introspection: how do we get the name of a class within a class?

假设我们有

class Foo {}

有没有办法从 class 中获取 "Foo"?

是的。

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

Kaiepi 的解决方案有它的用处,我将在下面提到,但也考虑:

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

Foo.perl

这为您的字面问题提供了一个简单的答案(尽管它忽略了您真正想要的东西,正如您在下面的评论中所解释的以及 metaprogramming 标签和您对单词 [= 的使用所建议的那样73=]).

OUR.WHO

我认为这通常比 ::?CLASS.^name 更合适,原因如下:

  • 看起来少line-noisy.

  • 适用于 所有 形式的包,即使用内置声明符 packagemodule、[=19 声明的包=],或 role 以及 class,以及 actormonitor 等自定义声明符

  • 如果读者调查OUR and/or .WHO in contrast to mostly distracting arcana if they investigate the ::?... construct,将引导读者找到最直接相关的问题。

::?CLASS 对比 ::?PACKAGE

OUR.WHO 仅适用于 value 语法槽,不适用于 type 语法槽。对于后者,你需要一个合适的 ::?... 形式,例如:

class Foo { has ::?CLASS $bar }

这些 ::?... 形式也可以用作值:

class Foo { has $bar = ::?CLASS }

因此,尽管它们相对丑陋,但在这个特定意义上它们更通用。也就是说,如果通用性非常重要,那么 ::?PACKAGE 会更好,因为它适用于所有形式的包。