【问题标题】:Time Warping Variable Initialization?时间扭曲变量初始化?
【发布时间】:2020-01-24 08:04:22
【问题描述】:

在以下简单的 for 循环中,我们通过增加一个无类型变量 ($n) 来创建一个数组 (@a):

my @a = do for 1..3 {
    state $n;
    $n.^name, $n++;
}

say @a;

结果是“有点”预期的:

[(Any 0) (Int 1) (Int 2)]

我说“种类”是因为我预计 $n 的第一个值是“未定义”值 (Any)。

就像,在产生第一个值 (Any) 之后,当我们增加 $n (在 $n 的第一个增量之后,我们有一个转换为 Int 之后)在赋值中也有一些时间扭曲事件,并且我们也得到了第一个改变的值。所以我们最终将第一个值设为 0(零)。

有人可以解释这种行为的确切机制吗?

【问题讨论】:

    标签: variables initialization raku


    【解决方案1】:

    Any.pm6#L519,候选人

    multi sub postfix:<++>(Mu:U $a is rw) { $a = 1; 0 }
    

    被使用。 还有一些未定义值的候选对象,您可以尝试

    my Bool $x; 
    dd $x++; #Bool::False
    
    my Num $y;
    dd $y++; #0e0
    

    【讨论】:

    • 所以,如果我理解正确的话,“推送”到数组 @a 是在后缀 ++ 函数隐含的操作之后完成的?
    • 是的,当然。与^name 相同。数组中有^name++的返回值。
    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2017-10-01
    • 2021-07-08
    • 2015-01-17
    相关资源
    最近更新 更多