gpt4 book ai didi

raku - 在 for 循环中使用隐式参数会导致挂起

转载 作者:行者123 更新时间:2023-12-04 13:30:23 26 4
gpt4 key购买 nike

考虑以下代码

my $a = "AABBCCBGG";
say join "\n", do for $a.comb.squish {
$a ~~ s/^ ($_+) //;
}

相对
my $a = "AABBCCBGG";
say join "\n", do for $a.comb.squish -> $b {
$a ~~ s/^ ($b+) //;
}

第一个永远挂起,而最后一个按预期执行。这是一个错误还是在使用我不理解的隐式 $_ 时有一些更精细的细节?使用乐道之星 2019.03.01。

最佳答案

您的代码使用 $_包含以下道德等价物:

/''+/

它永远循环(因为空字符串 '' 匹配无限次)。

(好吧,我只展示了一个简单的匹配,并且 $_ 必须分配或绑定(bind)到某个强制为字符串的值,否则将不会发生无限循环,并且您的代码必须为它绕过它的循环两次成为上述内容的道德等价物,但这些都是红鲱鱼。)

is there some finer detail while using the implicit $_ that I don't understand?



来自 the smartmatch doc :

The smartmatch operator aliases the left-hand side to $_



在代码中:
lhs ~~ rhs;

相当于:
$_ := lhs;
rhs.ACCEPTS(lhs);

我怀疑你没有考虑上面两行中的第一行。

(如果您想避免这种主题化,请单独使用第二行。1)

假设 $_被分配一个定义的非空字符串:
s/$_//;

将永远更新 $_为空字符串 ( '' )。

和:
$a ~~ s/^ ($_+) //;

将别名 $_$a然后更新 $_$a成为一个空字符串。

所以第二次围绕 for循环 ~~再次别名 $_$a ,它现在包含一个空字符串,然后你到达我的答案开始的无限循环条件。

脚注

1 在下面的评论中,Jo 问为什么 ~~需要“主题化”(别名 $_ 到 lhs)。权威答案大概存储在@Larry 的集体大脑中,可以说 the P6 design documents 表达得最好。 (在页面搜索“智能匹配”和“智能匹配”似乎是门票)。但我会写下我对这件事的看法。

首先,aiui,它不需要是这样的。

Aiui @Larry 可能刚刚决定依赖当前主题的构造(我认为这意味着 //s/// 和合适的例程调用)与 P5 一样。

以下是在 P5(带有合适的编译指示)和 P6 中运行的一些代码:
my $a = 'a value';
$_ = 'another value';
say $a ~~ s/value/changed string/;
say $a;
say $_;

你期望结果是什么?

在 P5 中:

a value
another changed string

在 P6 中:
「value」
a changed string
another value

P5离开 $a不变,修改 $_ ,然后将修改后的结果与原始 $a 进行比较并得出结论它们不匹配(因此 say $a ~~ ... 行表示空白行)。

P6 别名 $_$a在智能匹配期间,离开 $a根据 s/// 永久修改, 并恢复 $_之后恢复到之前的值。

如果我们坚持使用 P5 方式,我们也无法编写如下内容:
  • foo ~~ / ... /如果foo 是真的匹配正则表达式;
  • my $a = 'AA'; $a ~~ .uc无论$_ 的值如何,都让它为真在这段代码之前或之后;
  • foo ~~ .&bar匹配位置bar是一个期望参数的子,我们希望它得到 foo .

  • 与此同时, .ACCEPTS也可用。所以并不是说你不能做和 P5 一样的事情。只是,默认情况下,如果不首先接触 P5 和 @Larry,则对主题起作用的构造可能会像人们所期望的那样工作。总体上认为这是一件好事。

    总而言之,Jo,我听说 P5 符合您的期望,但假设这至少部分是因为您使用过 P5,并且您的期望在很大程度上基于它的功能,并且想知道在考虑之后它是否仍然是您喜欢的以上并给自己足够的时间来吸收它。我很想听听你关于一个月后的感觉的后续评论!

    至少,这是我目前对这个,呃,话题的想法。

    关于raku - 在 for 循环中使用隐式参数会导致挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57462127/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com