【问题标题】:Why do I get “Lexical with name '$x' does not exist in this frame” when using “will leave”?为什么我在使用“将离开”时得到“名称为 '$x' 的词汇在此框架中不存在”?
【发布时间】:2021-06-12 14:37:09
【问题描述】:

我有以下 Raku 代码:

class Thing {
    method close {
        say "closed";
    }
};

for 1..1000 {
    my $x will leave { .close } = Thing.new;
}

运行它,我得到错误:

Lexical with name '$x' does not exist in this frame
  in block <unit> at c.raku line 7

有趣的是,只有在迭代次数足够高时才会发生这种情况(使用 500 或 100,我没有收到任何错误消息)。

如果我将循环的主体更改为

my $x = Thing.new;
LEAVE $x.close;

然后一切正常,没有错误。

这里发生了什么?我误解了will leave 构造吗? (在我看来这两个版本应该是等价的。)

编辑:进一步观察 - 多次运行代码时,错误会出现不确定性。这表明问题与垃圾收集有关,但我仍然对这里实际发生的情况感到困惑。

我正在使用 Rakudo v2021.03。

【问题讨论】:

  • 感谢您的报告。 FWIW,我无法在 Rakudo 2021.05 上重现此内容。你能在那个版本中试试这个代码并告诉我们结果吗?
  • 我尝试使用 Rakudo 2021.05 运行相同的代码。原始代码工作正常,但如果我将迭代次数增加到 10000 次,错误会再次出现。如果我将close 方法的主体更改为say "closed ", $++;,我会观察到错误在大约 1500 到 2000 次迭代左右不确定地发生。

标签: raku


【解决方案1】:

这是一个错误。已经为它提出了问题:https://github.com/rakudo/rakudo/issues/4403

我建议同时使用解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2016-06-01
    • 2013-01-21
    • 2013-02-02
    • 2021-01-07
    • 2014-05-13
    相关资源
    最近更新 更多