作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
天生懒惰
D:\>6e "my @bar = 'a', 'b', 'c'; sub foo( @b ) { my $bar = 0; gather loop { print "*"; take ($bar, @b[$bar]); $bar++; last if $bar > 2; } }; .print for foo( @bar )"
*(0 a)*(1 b)*(2 c)
D:\>6e "my @bar = 'a', 'b', 'c'; sub foo( @b ) { my $bar = 0; eager gather loop { print "*"; take ($bar, @b[$bar]); $bar++; last if $bar > 2; } }; .print for foo( @bar )"
***(3 a)(3 b)(3 c)
take-rw
也不剪。
D:\>6e "my @bar = 'a', 'b', 'c'; sub foo( @b ) { my $bar = 0; eager gather loop { print "*"; take-rw ($bar, @b[$bar]); $bar++; last if $bar > 2; } }; .print for foo( @bar )"
***(3 a)(3 b)(3 c)
D:\>6e "my @bar = 'a', 'b', 'c'; sub foo( @b ) { my $bar = 0; eager gather loop { print "*"; take-rw ($bar + 0, @b[$bar]); $bar++; last if $bar > 2; } }; .print for foo( @bar )"
***(0 a)(1 b)(2 c)
>6e "my $bar = 0; .say for gather { take ($bar,); $bar++; take ($bar,) }"
(0)
(1)
>6e "my $bar = 0; .say for eager gather { take ($bar,); $bar++; take ($bar,) }"
(1)
(1)
eager
中的行为存在差异对比
lazy
案件。
最佳答案
Holli 已经接受了引用 Brad 两条评论的答案。我特意保持了那个简洁。
但是你正在阅读这篇文章。1 所以我会在这个答案中反其道而行之。($bar,...)
是一个包含$bar
的列表,而不是$bar
的值
问题中显示的行为实际上完全是关于容器与值,以及列表文字如何存储容器,而不是它们的值1:
my $bar = 0;
my $list = ($bar,);
say $list[0]; # 0
$bar = 1;
say $list[0]; # 1
for
循环需要值。
for
循环,它需要来自
lazy
表达式的值。这反过来并要求来自
gather
d 表达式的值。后者然后计算直到
take
,到那时它创建了一个列表,其第一个元素是容器
$bar
。此列表是
take
的结果。
.print
打印第一个列表。在打印时,
$bar
仍包含
0
。 (
$bar
的第一次递增尚未发生。)
for
循环,重新进入包含
take
(
loop
)的内部控制结构。发生的第一件事是
$bar
第一次增加。然后检查循环退出条件(并失败),因此第二次循环开始。另一个列表被创建。然后是
take
。
$bar
容器,打印为
1
,而不是
0
,因为在这一点上,
$bar
现在包含
1
。
1
,不再是
0
。因为所有
take
d 列表都具有相同的
$bar
容器作为它们的第一个元素。)
for
循环要求在
gather
处进行第四次访问。这在
loop
语句之后的语句处重新输入
take
。
$bar
第三次增加到
3
,然后
last if $bar > 2;
条件触发,退出循环(因此表达式是
gather
,最终是整个
.print for ...
语句)。
gather
ing 都在任何
print
ing 之前完成。
for
构造具有三个列表的序列。它尚未拨打任何
.print
电话。第三次围绕
loop
中的
gather
留下了包含
$bar
的
3
。
.print
。
$bar
包含
3
,因此它们都以
3
作为第一个元素打印。
[$bar, @bar[$bar]]
# instead of
($bar, @bar[$bar])
Scalar
容器中。 (这是因为新的非本地数组的所有元素都是新的Scalar
容器;这是使数组与列表不同的主要因素之一。)但是在这种情况下,效果与直接复制值相同放入数组中,因为$bar
中包含的值随着事情的进行而发生变化不再重要。0
、1
和2
,即每个数组实例化时包含在$bar
中的三个值。$bar + 0
也有效。$bar
。$bar.self
绑定(bind)或分配什么值,$bar
都应该工作并返回正确的值。$bar.self
绑定(bind)到$bar
容器,$bar
本身不是Scalar
!事实上,在一个更违反直觉的扭曲中,即使是$bar.VAR
,它使用.VAR
,一种"Returns the underlying Scalar
object, if there is one."的方法,最终仍被视为 r 值!)Scalar
是什么; Scalar
有什么关系; Scalar
的作用。关于raku - 急需的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59739980/
我发现 MSVC 的 _doserrno 上的文档 可以这么说,全局变量非常“稀疏”。 errno 的文档中提到了它的存在。 ,错误代码的标准 C 全局变量。同时_doserrno 似乎是 MSVC
使用 winston对于 node.js 日志记录,我得到 json 日志文件。在这种情况下,日志文件只是一系列(换行符分隔的)json 对象。这对于日志查询和将日志视为一流数据非常有用! 但是,Su
我是一名优秀的程序员,十分优秀!