包装限定名称。Package :: <&var> vs&Package :: var之间的差异(如果有的话)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (9)

通过阅读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;
    }
}

相同的页面声明这种限定条件&zape在上面列出的Foo :: Bar包中无法访问:

(这不适用于&zape变量)

但是,如果我尝试:

Foo::Bar::<&zape>;  # instead of   &Foo::Bar::zape;

它解决得很好。

我是否误解了文件或完全错过了要点?例如,代码引用变量与标量“不工作”背后的逻辑是什么?

提问于
用户回答回答于

Package :: <&var>和&Package :: var之间没有区别。

package Foo { our $var = "Bar" };
say $Foo::var === Foo::<$var>; # OUTPUT: «True␤» 

同上(当然):

package Foo { our &zape = { "Bar" } };
say &Foo::zape === Foo::<&zape>;# OUTPUT: «True␤»

文档(有点令人困惑)试图说的是,只有使用我们的声明才能访问包范围变量。有两个zapes,其中一个有词法范围(默认情况下为subs lexical scope),因此你无法访问那个。我在doc repo中提出了这个问题,并会尽快修复它。

用户回答回答于

我不知道差异,但Foo::Bar::<&zape>也可以修改为使用{}而不是<>,然后可以使用除文字之外的东西,如下所示:

my $name = '&zape';
Foo::Bar::{$name}()

要么

my $name = 'zape';
&Foo::Bar::{$name}()

扫码关注云+社区

领取腾讯云代金券