gpt4 book ai didi

raku - 为什么 `will end` 在程序级范围内的行为与 `will leave` 不同?

转载 作者:行者123 更新时间:2023-12-01 06:39:54 26 4
gpt4 key购买 nike

我认为在程序的顶层,will endwill leave 的行为是一样的,因为只有一个大的外部作用域可以退出/离开。我认为这两种方法都是检查变量最终值的好方法。

但是 will end 就像变量从未被初始化一样:

my $foo will end { put "Final value for \$foo is '$_'"} = 'bar';

put "\$foo is now '$foo'";

$foo ~= ' baz';

输出

$foo is now 'bar'
Use of uninitialized value $_ of type Any in string context.
Methods .^name, .perl, .gist, or .say can be used to stringify it to something meaningful.
in block at phaser_end.p6 line 1
Final value for $foo is ''

但是,只需将 will end 更改为 will leave 就可以实现我对其中任何一个的期望:

my $foo will leave { put "Final value for \$foo is '$_'"} = 'bar';

put "\$foo is now '$foo'";

$foo ~= ' baz';

输出

$foo is now 'bar'
Final value for $foo is 'bar baz'

为什么这里的行为会有所不同?

我正在使用 Rakudo-Star 2017.07。

更新

为了获得我期望的 will end 效果,我必须使用单独的 END block :

END block :

my $foo = 'bar';

END { put "Final value for \$foo is '$foo'"};

put "\$foo is now '$foo'";

$foo ~= ' baz';

我想真正的问题归结为为什么 END block 的行为与 will end block 的行为不同。

将结束 block :

my $foo will end { put "Final value for \$foo is '$_'"} = 'bar';

put "\$foo is now '$foo'";

$foo ~= ' baz';

最佳答案

重写

Why does will end behave differently than will leave

看起来 will end 有一个类似于 this old and now resolved bug for will begin 的错误.

除此之外,一切都如我所料:

my $leave will leave { say ['leave:', $_, OUTERS::<$leave>] } = 'leave';
my $end will end { say ['end:', $_, OUTERS::<$end>] } = 'end';
my $begin will begin { say ['begin:', $_, OUTERS::<$begin>] } = 'begin';
END { say ['END:', $_, OUTERS::<$end>, $end] }

$_ = 999;

显示

[begin: (Any) (Any)]
[leave: leave leave]
[END: 999 end end]
[end: 999 end]

Is the scope for the block with will end different than the scope of the block with will leave?

它们有相同的外层lexical scope对应于 UNIT 范围。

它们以不同的方式运行 dynamic scopes .离开 block 作为离开封闭 block 的一部分运行。结束 block 运行 after the compiler has completely finished with your code and is cleaning up :

sub MAIN(@ARGS) {
...
# UNIT scope -- your code -- is about to be created and compiled:
$comp.command_line ...
# UNIT scope no longer exists. We compiled it, ran it, and left it.
...
# do all the necessary actions at the end, if any
if nqp::gethllsym('perl6', '&THE_END') -> $THE_END {
$THE_END()
}
}

why does the END block behave differently than the will end block?

因为你在一个中使用了 $foo 而在另一个中使用了 $_

关于raku - 为什么 `will end` 在程序级范围内的行为与 `will leave` 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46220461/

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