使用标量变量来引用显式生成器内的数组

Lar*_*een 5 raku

我编写了一个代码来使用显式生成器内的数组变量来计算斐波那契数列,如下所示:

my @fib = [0],[1],-> @a, @b {[|@a Z+ |@b]} ... Inf;
say @fib[^6];
Run Code Online (Sandbox Code Playgroud)

这按预期工作。但是当我在同一代码中使用标量变量时,它也可以工作:

my @fib_v2 = [0],[1],-> $a, $b {[|$a Z+ |$b]} ... Inf;
say @fib_v2[^6];
Run Code Online (Sandbox Code Playgroud)

它们可以称为指向数组的标量变量吗?当它们以这种方式使用时,它们被称为什么?

请注意,我浏览了在线 Raku 文档,但很难发现特定信息,即是否可以使用标量变量引用数组。

Eli*_*sen 8

您应该说“标量变量绑定到数组”。因为那就是发生的事情。你可以这样想:

-> $a, $b { say $a; say $b }("foo", "bar")
Run Code Online (Sandbox Code Playgroud)

作为:

{ my $a := "foo"; my $b := "bar"; say $a; say $b }
Run Code Online (Sandbox Code Playgroud)

因此,当您将数组绑定到标量时,它仍然是一个Array对象。调用它的方法就可以了。它可能只会使阅读代码变得更加困难。

请注意,这与将数组分配给标量不同。

raku -e 'my $a := [1,2,3]; .say for $a'
1
2
3
Run Code Online (Sandbox Code Playgroud)

相对:

raku -e 'my $a = [1,2,3]; .say for $a'
[1 2 3]
Run Code Online (Sandbox Code Playgroud)

迭代for逻辑看到容器并将其作为$a迭代它的标志,即使它包含一个.Iterable

请注意,我浏览了在线 Raku 文档,但很难发现特定信息,即是否可以使用标量变量引用数组。

它基本上脱离了正确理解容器和绑定之间的关系。大约 4 年前,我写了一篇关于它的博客文章:https://opensource.com/article/18/8/containers-perl-6请原谅过时的命名:-)