【问题标题】:How do I solve "The iterator of this Seq is already in use"?如何解决“此 Seq 的迭代器已在使用中”?
【发布时间】:2020-10-16 19:45:43
【问题描述】:

这段代码:

sub MAIN(Int $N = 128)
{
    my @pascal = ((1,), { (0, |@^a) Z+ (|@^a, 0) } ... *);

    my @top = @pascal[^$N];
    say "Percentage of odd numbers in the first $N rows: ",
        (100 × @top».grep(* % 2).sum / @top.sum).fmt('%.12f%%');
}

给我一​​个错误:

The iterator of this Seq is already in use/consumed by another Seq
(you might solve this by adding .cache on usages of the Seq, or
by assigning the Seq into an array)
  in sub MAIN at ./pascal1 line 8
  in block <unit> at ./pascal1 line 1

知道如何解决吗?我试过在几个地方添加.cache,但没有成功。

【问题讨论】:

    标签: raku


    【解决方案1】:

    作为序列一部分的块正在创建一个 Seq。您应该可以像这样缓存它:

    { ( (0, |@^a) Z+ (|@^a, 0) ).cache }

    【讨论】:

    • 谢谢,这就行了。 (这是我没有尝试添加.cache 的一个地方。?)
    • 猜想我们需要一些特殊代码来处理 Seq 作为 ... 序列的一部分。
    【解决方案2】:

    Z 返回一个Seq

    Seq 产生它的下一个值时,它会丢弃前一个值。

    因此,您通常只能从Seq 获取值一次。

    您拥有的块 {…} 通过查看它生成的前一个 Seq 来工作。所以有一个问题。您可以查看Seq 中的内容,或者... 运算符可以查看Seq 中的内容


    问题是,您可能不希望 Z 的结果是 Seq,而是希望它是 List

    毕竟,您使用List (1,) 启动... 序列生成器。

    ((1,), { ((0, |@^a) Z+ (|@^a, 0)).List } ... *)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多