说我们有
class Foo {}
是否可以从课堂中获取“ Foo”?
答案 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
更合适:
行噪少。
适用于所有种形式的包装,即使用内置声明符package
,module
,grammar
或{{1 }}和role
,以及actor
,class
等自定义声明符。
如果读者调查OUR
和/或.WHO
,将会引导读者直接解决与之直接相关的问题,反之,如果读者调查the ::?...
construct,会使读者分散注意力。
monitor
与::?CLASS
::?PACKAGE
仅适用于 value 语法槽,而不适用于 type 语法槽。对于后者,您需要合适的OUR.WHO
格式,例如:
::?...
这些class Foo { has ::?CLASS $bar }
形式也可以用作值:
::?...
因此,尽管它们相对丑陋,但在这种特定意义上它们更为笼统。就是说,如果普遍性很重要,那么class Foo { has $bar = ::?CLASS }
就更好了,因为它适用于所有形式的软件包。