2017-05-05 108 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)时,类不会作为包变量安装,并且文件范围查找失败。

相关问题