2016-01-09 21 views
9

W innym pytaniu (How can I declare and use a Perl 6 module in the same file as the program?), miałem kodu:Jak mogę sprawdzić moduł Perl 6?

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

foo(137); 

Chciałem sprawdzić moduł Foo aby zobaczyć, czy jest zdefiniowana, a co może być w nim zrobić trochę debugowania. Ponieważ Foo jest modułem, a nie klasą, czy meta-metody mają sens?

Ponadto, myślałem, że był sposób, aby uzyskać listę metod w klasie. Chciałbym uzyskać listę podprogramów w module. To byłby jeden ze sposobów sprawdzenia, czy zdefiniowałem właściwe rzeczy, a Perl 6 o nich wie. W moich materiałach z Perl 5 często testuję, że zdefiniowałem podprogram, ponieważ miałem okres, w którym wybrałem nazwę w module i nieco inną nazwę w testach (jak na przykład ostatniej nocy, jak sądzę, z valid_value i is_value_value). Gdybym mógł przetestować, że zdefiniowano foo, mógłbym tu trochę debugować.

Odpowiedz

8

Możesz dostać się do tabeli symboli paczek, dodając do nazwy końcowy znak ::. Będzie to działać dla modułów i klas obu, ale w przypadku klas nie będzie zawierać żadnych metod, ponieważ są one związane z obiektem typu, a nie z samym pakietem.

tablicy symboli jest typu Stash, który jest łączne (to znaczy obsługuje operacje mieszania podobne)

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) 
Powiązane problemy