perl6 – 为什么我不能在Routine :: WrapHandle上调用meta方法?
发布时间:2020-12-16 06:26:47 所属栏目:大数据 来源:网络整理
导读:这是我之前的一个 Why is Perl 6’s unwrap method a method of Routine?的一个持续的问题,但大多是无关的. 记录wrap方法返回“一个名为WrapHandle的私有类的实例.除了泄漏一个私有类的奇怪之外,它实际上并不是返回的东西的名称.该类实际上是Routine :: Wrap
这是我之前的一个
Why is Perl 6’s unwrap method a method of Routine?的一个持续的问题,但大多是无关的.
记录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 但这是问题所在.我想在Routine :: WrapHandle上调用.^方法.这不起作用: > Routine::WrapHandle.^methods Could not find symbol '&WrapHandle' in block <unit> at <unknown file> line 1 这与在未定义的类名上尝试它相同: > 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 那里发生了什么? 解决方法
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(而不是隐式),该类不会作为包变量安装,并且文件范围内的查找失败. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |