自省:我们如何在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.
适用于 所有 形式的包,即使用内置声明符 package
、module
、[=19 声明的包=],或 role
以及 class
,以及 actor
、monitor
等自定义声明符
如果读者调查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
会更好,因为它适用于所有形式的包。
假设我们有
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.
适用于 所有 形式的包,即使用内置声明符
package
、module
、[=19 声明的包=],或role
以及class
,以及actor
、monitor
等自定义声明符如果读者调查
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
会更好,因为它适用于所有形式的包。