变量的声明和赋值:静默删除赋值

jjm*_*elo 9 variable-assignment perl6 variable-declaration raku

您可以声明变量列表并在Perl 6中为它们分配一些值

my ($a, $b) = 33,44 # $a will be 33 and $b 44
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试在变量声明后分配值,则将以静默方式删除值

my ($a = 44, $b = 33); 
say $a, $b; #OUTPUT: «(Any)(Any)?» 
Run Code Online (Sandbox Code Playgroud)

从那以后它就变得更加怪异了

 my ($a = 44, $b);
Run Code Online (Sandbox Code Playgroud)

失败了:

===SORRY!=== Error while compiling /tmp/G7JgLMe1Wq
Cannot put required parameter $b after optional parameters
Run Code Online (Sandbox Code Playgroud)

my ($a, $b = 33);
Run Code Online (Sandbox Code Playgroud)

将与将它们中的任何一个分配在一起具有相同的结果.

这种行为让我感到困惑.它应该发出警告吗?第一个表达式是否也会产生与可选参数相同的错误?我们应该将其记录为陷阱吗?上述所有的?

小智 9

通过知道除了赋值语法之外,还可以理解行为,还有签名绑定语法,其中左侧基本上具有签名中参数的所有特征(减去一些NIY特征):

    <Zoffix__> m: my ($a, $b = 33) := \(); dd [$a, $b]
    <camelia> rakudo-moar 472f6e484: OUTPUT: «Too few positionals passed to '<unit>'; expected 1 or 2 arguments but got 0?  in block <unit> at <tmp> line 1??»
    <Zoffix__> m: my ($a, $b = 33) := \(100); dd [$a, $b]
    <camelia> rakudo-moar 472f6e484: OUTPUT: «[100, 33]?»
    <Zoffix__> m: my ($a, $b = 33) := \(100, 200); dd [$a, $b]
    <camelia> rakudo-moar 472f6e484: OUTPUT: «[100, 200]?»
Run Code Online (Sandbox Code Playgroud)

所以会发生什么是声明具有默认值的可选参数.这就是你后面的例子讨论所需参数的原因; 您不能在常规签名中的选项后添加必需项.但是,由于您实际上没有执行任何绑定,因此变量仍未分配.

将默默地放弃

我们可以实现一些启发式方法来检测这种情况,并在LHS看起来像签名案例并且缺少初始化程序时警告用户.将其归为R#1864.