【问题标题】:How can I inspect a Perl 6 module?如何检查 Perl 6 模块?
【发布时间】:2016-04-13 19:48:20
【问题描述】:

在另一个问题 (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 东西中,我经常测试我是否定义了一个子例程,因为我有一段时间会在模块中选择一个名称,而在测试中选择一个稍微不同的名称(我猜,就像昨晚一样,@987654324 @ 和 is_value_value)。如果我可以测试 foo 是否已定义,我可以在这里进行一些调试。

【问题讨论】:

    标签: module raku


    【解决方案1】:

    您可以通过在包名后面添加:: 来获取包的符号表。这对模块和类都有效,但如果类不包含任何方法,因为它们与类型对象相关联,而不是与包本身相关联。

    符号表的类型为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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-22
      • 2012-02-05
      • 2012-03-09
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多