为什么我不能在 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
方法,而不是在单个元素上调用。
对此有多种解决方案:
- 确保没有容器:
my $test := $file.read: 8;
通过 binding Buf
.
确保没有容器
- 让它看起来像一个数组
my @test := $file.read: 8;
基本上与 1 相同,使 @test
成为 Buf
的别名。注意这里也要用到绑定,否则你看到的效果是一样的。
- 让它像 Iterable 一样工作
.chr.say for @$test;
通过在 @
前面加上前缀,您可以迭代它。这基本上是您已经找到的 $test.list
解决方法的语法糖。
关于 $test.is-lazy.say
,即 False
几乎适用于任何事物,例如42.is-lazy.say; # False
,所以这并不能告诉你很多 :-)
给定以下代码,如果 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
方法,而不是在单个元素上调用。
对此有多种解决方案:
- 确保没有容器:
my $test := $file.read: 8;
通过 binding Buf
.
- 让它看起来像一个数组
my @test := $file.read: 8;
基本上与 1 相同,使 @test
成为 Buf
的别名。注意这里也要用到绑定,否则你看到的效果是一样的。
- 让它像 Iterable 一样工作
.chr.say for @$test;
通过在 @
前面加上前缀,您可以迭代它。这基本上是您已经找到的 $test.list
解决方法的语法糖。
关于 $test.is-lazy.say
,即 False
几乎适用于任何事物,例如42.is-lazy.say; # False
,所以这并不能告诉你很多 :-)