在另一个问题(How can I declare and use a Perl 6 module in the same file as the program?)中,我有这样的代码:
module Foo {
sub foo ( Int:D $number ) is export {
say "In Foo";
}
}
foo( 137 );
我想检查Foo
模块以查看它是否已定义以及可能在其中进行一些调试的内容。既然Foo是一个模块而不是一个类,那么元方法是否有意义?
另外,我认为曾经有一种方法可以获得类中的方法列表。我想获得一个模块中的子程序列表。这将是测试我定义正确的东西和Perl 6了解它们的一种方法。在我的Perl 5中,我经常测试我已经定义了一个子程序,因为我有一段时间我会在模块中选择一个名字,并且在测试中有一个稍微不同的名字(比如昨晚我猜,{{ 1}}和valid_value
)。如果我可以测试is_value_value
已定义,我可以在这里进行一些调试。
答案 0 :(得分:8)
您可以通过在其名称中添加尾随::
来获取包的符号表。这适用于模块和类,但是在类的情况下不会包含任何方法,因为它们与类型对象相关联,而不是包本身。
符号表的类型为Stash
,它是关联的(即支持类似哈希的操作):
module Foo {
sub foo is export { ... }
sub bar is export(:bar) { ... }
our sub baz { ... }
}
# inspect the symbol table
say Foo::.WHAT; #=> (Stash)
say Foo::.keys; #=> (EXPORT &baz)
say Foo::<&baz>.WHAT; #=> (Sub)
# figure out what's being exported
say Foo::EXPORT::.keys; #=> (bar DEFAULT ALL)
say Foo::EXPORT::bar::.keys; #=> (&bar)
say Foo::EXPORT::DEFAULT::.keys; #=> (&foo)
say Foo::EXPORT::ALL::.keys; #=> (&bar &foo)