gpt4 book ai didi

raku - 为什么我不能在 Routine::WrapHandle 上调用元方法?

转载 作者:行者123 更新时间:2023-12-04 18:25:10 24 4
gpt4 key购买 nike

这是我之前的一个问题 Why is Perl 6's unwrap method a method of Routine? , 但大多无关。
wrap方法被记录为返回“一个名为 WrapHandle 的私有(private)类的实例。除了泄漏私有(private)类很奇怪之外,它实际上并不是返回的事物的名称。该类实际上是 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

这与在未定义的类名上尝试相同:
> 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 (而不是隐含的 our ),该类将不会作为包变量安装,并且在文件范围内的查找失败。

关于raku - 为什么我不能在 Routine::WrapHandle 上调用元方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43812696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com