jjm*_*elo 9 variable-assignment perl6 variable-declaration raku
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.