该Perl6文档状态“默认情况下,参数绑定到他们的说法,并标记为只读。” 但是运行以下代码:
# Example 1
sub f1 ( $x ) { say $x.VAR.WHAT; say $x.WHAT; say $x }
f1(1);
Run Code Online (Sandbox Code Playgroud)
产量:
(Scalar)
(Int)
1
Run Code Online (Sandbox Code Playgroud)
而这段代码:
# Example 2
my $y := 1;
say $y.VAR.WHAT; say $y.WHAT; say $y;
Run Code Online (Sandbox Code Playgroud)
产量:
(Int)
(Int)
1
Run Code Online (Sandbox Code Playgroud)
这(Scalar)是我不理解的Example1的输出:我应该将Int 1参数绑定到标识符时,为什么会有标量$x?似乎该值已1“分配”给$x,而不是“绑定”了。
下面这行声明了一个变量并将其绑定到右侧的数字。
my $a := 42;
Run Code Online (Sandbox Code Playgroud)
效果是这$a不是 a Scalar,而是 an Int,正如可以看到的
say $a.VAR.^name;
Run Code Online (Sandbox Code Playgroud)
我的问题是,我可以在一个声明中绑定多个变量吗?这不起作用:
my ($a, $b) := 17, 42;
Run Code Online (Sandbox Code Playgroud)
因为,正如使用 所见say $a.VAR.^name,现在$a和$b都是Scalars。(我想我明白为什么会发生这种情况,问题是是否有一种不同的方法可以在不创建s的情况下将$a和绑定$b到给定Int的Scalars。)
此外,在这种情况下使用:=和之间有什么区别=吗?
[注意:我根据旧版本的 Rakudo 问这个问题。正如已接受的答案中所解释的,令人困惑的输出是 Rakudo bug 的结果,现已解决。我留下了下面 Q 的原始版本以供历史参考。]
\nRaku 有时会禁止重新绑定;以下两行
\nsub f($a) { $a := 42 }\nmy \\var = \'foo\'; var := \'not-foo\';\nRun Code Online (Sandbox Code Playgroud)\n产生编译时错误:
\n===SORRY!=== Error while compiling \nCannot use bind operator with this left-hand side\nRun Code Online (Sandbox Code Playgroud)\n然而,Raku 允许在很多很多情况下重新绑定 \xe2\x80\x93 ,包括许多让我大吃一惊的情况。以下所有内容都成功重新绑定;每个say输出not-foo。
sub f($a) { $a := 42 }\nmy \\var = \'foo\'; var := \'not-foo\';\nRun Code Online (Sandbox Code Playgroud)\n因此,目前看来,只要满足以下任一条件,任何名称都可以重新绑定,无论是否有印记:
\nAny施加的类型约束),或者@%让我说,我明白,我要问关于标题是可疑的做法(如解释开始在这里),但我缺乏了解涉及所涉及的语法.
当我第一次尝试将标量绑定到无标记符号时,我这样做了:
my \a = $(3);
Run Code Online (Sandbox Code Playgroud)
认为$(...)将Int 3打包在标量中(如文档中似乎所建议的那样),然后将其绑定到符号a.这似乎不起作用:Scalar无处可寻(a.VAR.WHATreturn(Int),而不是(Scalar)).
在上面提到的帖子中,raiph提到可以使用不同的语法执行所需的绑定:
my \a = $ = 3;
Run Code Online (Sandbox Code Playgroud)
哪个有效.鉴于结果,我怀疑该陈述可以等同地表达,虽然不那么简洁,因为:my \a = (my $ = 3)我可以理解.
这留下了一个问题:为什么尝试$(...)不起作用,它又做了什么?
[编辑:关闭支持/sf/ask/4846205451/,这是我在更清楚地理解我在这个问题中想问的内容后制定的。 ]
\n我的理解是禁止无符号变量重新绑定有目的或好处吗?是一个没有印记的符号永远不可能无法反弹。引用那个答案:
\n\n\n是的,[当前的行为]肯定是设计使然,而且 - 就像 [Raku] 设计中的大多数东西一样 - 这样做的原因不止一个。\xe2\x80\xa6 决定采用无符号符号形式“静态单一赋值”语法\xe2\x80\xa6。造成这种情况的原因有多种,包括\xe2\x80\xa6 通过让读者知道符号永远不会反弹到新值的形式来增强程序可读性
\n
(强调已添加。)
\n鉴于此,我非常惊讶地看到下面的代码:
\nmy Int \\b = 8;\nsay "{b*b}"; # OUTPUT: \xc2\xab64\xc2\xbb\n\nb := 4;\nsay "{b*b}"; # OUTPUT: \xc2\xab16\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n也就是说,当b声明时没有印记但具有类型Int约束时,它可以反弹 \xe2\x80\x93 ,这与缺乏该类型约束时不同。这种行为是错误还是正确的?
如果是,它如何符合上面链接的答案中提到的设计考虑因素?
\n(另请参阅GitHub 上的Raku/doc 问题线程,了解此行为及其是否是有意为之的讨论。)
\n绑定变量和绑定模板*ngIf中的方法之间是否有任何区别.
例如:
情况1:
<div *ngIf="myVar">ABC</div>
Run Code Online (Sandbox Code Playgroud)
案例2:
<div *ngIf="myFunction()">ABC</div>
myFunction() : boolean {
if (cond1 && cond2 && cond3) {
return true;
} else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
对性能有影响吗?
我正在尝试使用2种情况,获取范围错误:最大调用堆栈超出.
帮我这个?谢谢