这是我之前的一个问题,为什么Perl 6的解包方法是一个常规方法?,但大多不相关.
该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
Run Code Online (Sandbox Code Playgroud)
但这是问题所在.我想叫.^methods上Routine::WrapHandle.这不起作用:
> Routine::WrapHandle.^methods
Could not find symbol '&WrapHandle'
in block <unit> at <unknown file> line 1
Run Code Online (Sandbox Code Playgroud)
这与在未定义的类名上尝试它相同:
> Foo::Baz.^methods
Could not find symbol '&Baz'
in block <unit> at <unknown file> line 1
Run Code Online (Sandbox Code Playgroud)
我可以在实例上调用元方法:
> $wrap-handle.^methods
(restore)
> $wrap-handle.^name
Routine::WrapHandle
Run Code Online (Sandbox Code Playgroud)
那里发生了什么?
Routine::WrapHandle看起来像这样的定义:
my class Routine {
method wrap(&wrapper) {
my class WrapHandle { ... }
...
}
}
Run Code Online (Sandbox Code Playgroud)
我们可以忽略周围的方法; 重要的是我们正在处理外部类中定义的词法内部类.简化一些,我们得出以下模式:
package Foo {
my class Bar {}
say Bar.^name; #=> Foo::Bar
}
say try Foo::Bar; #=> Nil
Run Code Online (Sandbox Code Playgroud)
内部类的完全限定名称将包括封闭包的名称,但由于显式my(而不是隐式our),该类不会作为包变量安装,并且文件范围内的查找失败.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |