为什么我不能在 Raku 的赋值后进行迭代?

Why can't I iterate after an assignment in Raku?

给定以下代码,如果 Buf 已分配给变量,我似乎无法对其进行迭代,除非我将其强制转换为列表,即使它不是惰性序列。给出了什么?

    my $file = open $path, bin => True;
    $_.chr.say for $file.read: 8; # works well

    my $test = $file.read: 8;
    $_.chr.say for $test; # fails with "No such method 'chr' for invocant of type 'Buf[uint8]'"
    $_.chr.say for $test.list; # works well
    $test.is-lazy.say; # False

失败的原因是:

my $test = $file.read: 8;

$file.read 返回的 Buf 放入一个 Scalar 变量中,也就是在一个容器中。而 containerized 被 for 解释为 itemized,被认为是单个项目。因此:

.chr.say for $test;

您是在整体 Buf 上调用 .chr 方法,而不是在单个元素上调用。

对此有多种解决方案:

  1. 确保没有容器:
my $test := $file.read: 8;

通过 binding Buf.

确保没有容器
  1. 让它看起来像一个数组
my @test := $file.read: 8;

基本上与 1 相同,使 @test 成为 Buf 的别名。注意这里也要用到绑定,否则你看到的效果是一样的。

  1. 让它像 Iterable 一样工作
.chr.say for @$test;

通过在 @ 前面加上前缀,您可以迭代它。这基本上是您已经找到的 $test.list 解决方法的语法糖。

关于 $test.is-lazy.say,即 False 几乎适用于任何事物,例如42.is-lazy.say; # False,所以这并不能告诉你很多 :-)