变量的声明和赋值:悄悄地删除赋值

Declaration and assignment of variables: silently dropping of assigned values

您可以 declare a list of variables and assign them some value 在 Perl 6

my ($a, $b) = 33,44 # $a will be 33 and $b 44

但是,如果您尝试在变量声明之后赋值,这些值将被静默删除

my ($a = 44, $b = 33); 
say $a, $b; #OUTPUT: «(Any)(Any)␤» 

从那里变得更奇怪,因为

 my ($a = 44, $b);

失败:

===SORRY!=== Error while compiling /tmp/G7JgLMe1Wq
Cannot put required parameter $b after optional parameters

my ($a, $b = 33);

将与将其中任何一个分配在一起得到相同的结果。

这种行为让我感到困惑。它应该发出警告吗?第一个表达式是否也会产生关于可选参数的相同错误?我们应该将其记录为 trap 吗?以上都是?

可以通过了解赋值语法以及签名绑定语法来理解行为,其中左侧基本上具有签名中参数的所有特征(减去几个 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]␤»

因此,您声明了具有默认值的可选参数。这就是为什么你后面的例子谈论的是必需的参数;您也不能在常规签名中将必需项放在可选项之后。但是,由于您实际上并未执行任何绑定,因此变量仍未分配。

will be silently dropped

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