2017-05-05 121 views
5

這是來自我以前的Why is Perl 6's unwrap method a method of Routine?的一個持續問題,但大多數情況下並不相關。爲什麼我不能在Routine :: WrapHandle上調用元方法?

wrap方法記錄在案,以返回「之稱WrapHandle一個私有的類的實例,除此之外爲奇數對泄漏一類是私有的,它不是真正的那個回來的東西的名字的類實際上是Routine::WrapHandle。: 。

$ perl6 
> sub f() { say 'f was called' } 
sub f() { #`(Sub|140397740886648) ... } 
> my $wrap-handle = &f.wrap({ say 'before'; callsame; say 'after' }); 
Routine::WrapHandle.new 

但這裏的問題,我想叫.^methodsRoutine::WrapHandle這並不工作:

> Routine::WrapHandle.^methods 
Could not find symbol '&WrapHandle' 
    in block <unit> at <unknown file> line 1 

這是一樣的嘗試它在一個未定義的C ^姑娘的名字:

> Foo::Baz.^methods 
Could not find symbol '&Baz' 
    in block <unit> at <unknown file> line 1 

我可以調用雖然實例元方法:

> $wrap-handle.^methods 
(restore) 
> $wrap-handle.^name 
Routine::WrapHandle 

這是怎麼回事呢?

+1

這是[詞彙班級](https://github.com/rakudo/rakudo/search?&q=WrapHandle&type=) –

回答

6

Routine::WrapHandle定義看起來是這樣的:

my class Routine { 
    method wrap(&wrapper) { 
     my class WrapHandle { ... } 
     ... 
    } 
} 

我們可以忽略周圍的方法;重要的是我們正在處理一個在外部類中定義的詞法內部類。簡化一些,我們得出以下模式:

package Foo { 
    my class Bar {} 
    say Bar.^name; #=> Foo::Bar 
} 

say try Foo::Bar; #=> Nil 

內部類的完全限定名將包括封閉包的名稱,但由於明確my(而不是隱含our)時,類不會作爲包變量安裝,並且文件範圍查找失敗。

相關問題