【问题标题】:Why can't I iterate after an assignment in Raku?为什么我不能在 Raku 中分配后进行迭代?
【发布时间】:2021-12-21 16:42:27
【问题描述】:

鉴于以下代码,如果 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

【问题讨论】:

    标签: raku


    【解决方案1】:

    失败的原因是:

    my $test = $file.read: 8;
    

    $file.read 返回的Buf 放入Scalar 变量中,也就是容器内。并且容器化被for 解释为逐项,被视为单个项目。所以:

    .chr.say for $test;
    

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

    对此有多种解决方案:

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

    这通过绑定Buf确保没有容器。

    1. 让它看起来像一个数组
    my @test := $file.read: 8;
    

    基本同1,将@test设为Buf的别名。请注意,这也应该使用绑定,否则您将获得与您看到的相同的效果。

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-01-09
      • 2010-10-22
      • 2011-02-05
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多