【问题标题】:Really binding an argument to a parameter? (Perl6)真的将参数绑定到参数吗? (Perl6)
【发布时间】:2019-11-05 00:21:45
【问题描述】:

Perl6 docs 状态“默认情况下,参数绑定到其参数并标记为只读。”但运行以下代码:

# Example 1
sub f1 ( $x ) { say $x.VAR.WHAT; say $x.WHAT; say $x }
f1(1);

产量:

(Scalar)
(Int)
1

这段代码:

# Example 2
my $y := 1;
say $y.VAR.WHAT; say $y.WHAT; say $y;

产量:

(Int)
(Int)
1

我不明白的是 Example1 的输出中的 (Scalar):当我应该将 Int 1 - 参数绑定到标识符 $x 时,为什么会有一个标量?似乎值1 被“分配”给$x,而不是“绑定”。

【问题讨论】:

    标签: variable-assignment raku variable-binding


    【解决方案1】:

    Scalar 容器也用于指示项目,从而防止它们变平。在没有类型约束的情况下,实现会将传入参数保守地包装到只读Scalar 容器中,以避免发生任何意外的扁平化。对比一下:

    sub foo($x) {
        my @a = $x;
        say @a.elems;
    }
    foo([1,2,3]);
    

    输出 1(没有展​​平),带有无符号绑定:

    sub foo(\x) {
        my @a = x;
        say @a.elems;
    }
    foo([1,2,3])
    

    输出 3,因为没有强加项目上下文。如果Scalar 容器不存在,两者都会输出 3。

    在存在非Iterable 类型约束的情况下,将省略此包装。这样写:

    sub f1(Int $x) {
        say $x.VAR.WHAT;
        say $x.WHAT;
        say $x
    }
    f1(1)
    

    将输出:

    (Int)
    (Int)
    1
    

    .VAR 只是在非容器上产生身份。

    【讨论】:

      猜你喜欢
      • 2016-10-25
      • 2012-11-22
      • 2023-03-29
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多