相关疑难解决方法(0)

禁止无重复变量重新绑定是否有目的或好处?

在试图更好地理解无格变量以及它们与$sigiled变量的区别时,我发现,与$sigiled变量不同,sigilless变量在初始化后无法反弹:

my $a = 42;
my $b := $a;
$b := 42;       # No exception generated

my \c := $a;
c := 42;        # OUTPUT: «Cannot use bind operator with this left-hand side?»
Run Code Online (Sandbox Code Playgroud)

这是设计的吗?如果是这样,当$不禁止这些变量被禁止时,是否有目的或好处禁止无重复变量重新绑定?

perl6 raku

10
推荐指数
2
解决办法
218
查看次数

重新绑定的规则是什么?

[注意:我根据旧版本的 Rakudo 问这个问题。正如已接受的答案中所解释的,令人困惑的输出是 Rakudo bug 的结果,现已解决。我留下了下面 Q 的原始版本以供历史参考。]

\n

Raku 有时会禁止重新绑定;以下两行

\n
sub f($a) { $a := 42 }\nmy \\var = \'foo\'; var := \'not-foo\';\n
Run Code Online (Sandbox Code Playgroud)\n

产生编译时错误:

\n
===SORRY!=== Error while compiling \nCannot use bind operator with this left-hand side\n
Run Code Online (Sandbox Code Playgroud)\n

然而,Raku 允许在很多很多情况下重新绑定 \xe2\x80\x93 ,包括许多让我大吃一惊的情况。以下所有内容都成功重新绑定;每个say输出not-foo

\n
sub f($a) { $a := 42 }\nmy \\var = \'foo\'; var := \'not-foo\';\n
Run Code Online (Sandbox Code Playgroud)\n

因此,目前看来,只要满足以下任一条件,任何名称都可以重新绑定,无论是否有印记:

\n
    \n
  1. 该名称具有任何显式类型约束(包括或符号Any施加的类型约束),或者@%
  2. \n
  3. 重新绑定使用限定名称。 …

immutability rakudo lexical-scope variable-binding raku

7
推荐指数
1
解决办法
312
查看次数