gpt4 book ai didi

raku - 绑定(bind)到例程参数的严格类型检查

转载 作者:行者123 更新时间:2023-12-04 10:46:27 26 4
gpt4 key购买 nike

使用下面的例程定义

sub bar( Int @stuff ) {
return [+] @stuff;
}

以下两行均失败:
say bar( ^3 );
say bar( [1,2,3] );

有错误
Type check failed in binding to parameter '@stuff'; 
expected Positional[Int] but got Array ($[1, 2, 3])

但是,分配给具有相同定义的变量是有效的
my Int @works = [1,2,3] ;
say bar( @works );

显然变量赋值和参数绑定(bind)的工作方式并不完全相同,但是是因为类型检查是严格的吗?
或者还有其他机制在起作用吗?

最佳答案

作业是 复制手术。当我们说:

my @a = @b;

然后它:
  • @b 获取迭代器
  • 迭代它,将每个值分配到 @a 的槽中

  • 这就是为什么将来分配到 @b (或 push es,或 pop s 等​​)不会影响 @a . (顺便说一句,这也意味着 my @a = [1,2,3] 相当浪费,因为它构造了一个匿名的 Array ,只是对其进行迭代,然后立即将其留给 GC。)

    当我们有:
    my @a = 1, 2, 3;
    my Int @b = @a;

    然后对每个分配执行类型检查到 @b 的槽中.重要的是值(value)观。当然,我们必须做 O(n) 类型检查,但是 = 的语义意味着我们无论如何都在进行 O(n) 操作。

    相比之下,绑定(bind)是 别名 手术。它使符号引用成为一个值。这是 O(1) 操作。如果我们有:
    my @a = 1, 2, 3;
    my Int @b := @a;

    那么它一定会失败,因为 @a没有受到适当的约束。我们不能只通过 @a并检查其值为 Int ;一方面,它会改变操作的复杂性,使代码的性能难以理解,而且, @a例如,以后可能会有 1.5分配给它,在 @b 上呈现类型约束没有意义,因为它给同一个东西起了别名。

    参数传递通过绑定(bind)起作用,因此在问题中观察到了效果。

    关于raku - 绑定(bind)到例程参数的严格类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55405916/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com