通读https://docs.perl6.org/language/packages#Package-qualified_names,它概述了使用以下语法限定包变量:
Foo::Bar::<$quux>; #..as an alternative to Foo::Bar::quux;
作为参考,本文档中使用的包结构为:
class Foo {
sub zape () { say "zipi" }
class Bar {
method baz () { return 'Þor is mighty' }
our &zape = { "zipi" }; #this is the variable I want to resolve
our $quux = 42;
}
}
同一页面指出,这种限定方式不适用于访问上面列出的Foo::Bar包中的&zape
:
(这不适用于&zape变量)
然而,如果我尝试:
Foo::Bar::<&zape>; # instead of &Foo::Bar::zape;
它可以很好地解决问题。
我是否曲解了文档,或者完全误解了所提出的观点?例如,代码引用变量与标量之间的“不起作用”背后的逻辑是什么?
发布于 2019-06-11 03:05:17
我不知道有什么不同,但Foo::Bar::<&zape>
也可以修改为使用{}
而不是<>
,然后可以与文字以外的其他东西一起使用,如下所示:
my $name = '&zape';
Foo::Bar::{$name}()
或
my $name = 'zape';
&Foo::Bar::{$name}()
发布于 2019-06-11 00:54:57
Package::<&var>和&Package::var没有区别。
package Foo { our $var = "Bar" };
say $Foo::var === Foo::<$var>; # OUTPUT: «True»
subs也是如此(当然):
package Foo { our &zape = { "Bar" } };
say &Foo::zape === Foo::<&zape>;# OUTPUT: «True»
文档(有点令人困惑)试图说明的是,包范围的变量只有在使用我们的声明时才能被访问。有两个zape
,其中一个有词法作用域(默认情况下subs有词法作用域),所以你不能访问那一个。我已经在文档存储库中提出了this issue,并将尝试尽快修复它。
https://stackoverflow.com/questions/56524991
复制相似问题