2016-01-09 34 views
9

は別の質問(How can I declare and use a Perl 6 module in the same file as the program?)で、私はこのようなコードを持っていた:Perl 6モジュールの検査方法を教えてください。

module Foo { 
    sub foo (Int:D $number) is export { 
     say "In Foo"; 
     } 
    } 

foo(137); 

私はそれが定義されていますかどうかを確認するために、何がデバッグのビットを行うために、そこにあるかもしれないFooモジュールを検査したかったです。 Fooはモジュールでありクラスではないので、メタメソッドは意味がありますか?

また、以前はクラス内のメソッドのリストを取得する方法があると思いました。私はモジュール内のサブルーチンのリストを取得したいと思います。それは私が正しいものを定義し、Perl 6がそれらについて知っていることをテストする1つの方法になります。私のPerl 5のものでは、モジュールで名前を選択する期間があったため、サブルーチンを定義したことがよくあります(昨夜のように、valid_valueis_value_value)。 fooが定義されているかどうかテストできたら、ここで少しデバッグできます。

答えて

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) 
関連する問題