隐式惰性 gather/take 不被视为 "lazy" 对象
Implicitly lazy gather/take not considered a "lazy" object
documentation for gather/take mentions
Binding to a scalar or sigilless container will also force laziness.
然而,
my \result = gather { for 1..3 { take $_² } };
say result.is-lazy # OUTPUT: «False»
如果您使用标量并使用 :=
进行绑定,也会发生同样的情况。有什么方法可以创建隐式惰性 gather/take 语句吗?
Update:其实是懒惰的,只是没有按照预期的方式响应is-lazy方法:
my $result := gather { for 1..3 { say "Hey"; take $_² } };
say $result[0] # OUTPUT: «Hey1»
所以问题是"What are the conditions for is-lazy to consider things actually lazy?"
我认为问题确实在于您实际上无法分辨 gather
块中发生的事情。所以这就是 Seq
对象告诉你它不是懒惰的原因。
也许更多的是文档问题:如果 is-lazy
returns True
,那么您可以确定 Seq
(好吧,实际上它的基础 Iterator
)不会自行结束。如果is-lazy
returnsFalse
,基本就是我们不能确定
有人可能会争辩说,在那种情况下 is-lazy
应该 return Bool
类型对象,这也将被解释为假(因为所有类型对象都被认为是 False
在布尔上下文中)。但这至少会给出一些迹象表明它确实是不确定的/不可判定的。
documentation for gather/take mentions
Binding to a scalar or sigilless container will also force laziness.
然而,
my \result = gather { for 1..3 { take $_² } };
say result.is-lazy # OUTPUT: «False»
如果您使用标量并使用 :=
进行绑定,也会发生同样的情况。有什么方法可以创建隐式惰性 gather/take 语句吗?
Update:其实是懒惰的,只是没有按照预期的方式响应is-lazy方法:
my $result := gather { for 1..3 { say "Hey"; take $_² } };
say $result[0] # OUTPUT: «Hey1»
所以问题是"What are the conditions for is-lazy to consider things actually lazy?"
我认为问题确实在于您实际上无法分辨 gather
块中发生的事情。所以这就是 Seq
对象告诉你它不是懒惰的原因。
也许更多的是文档问题:如果 is-lazy
returns True
,那么您可以确定 Seq
(好吧,实际上它的基础 Iterator
)不会自行结束。如果is-lazy
returnsFalse
,基本就是我们不能确定
有人可能会争辩说,在那种情况下 is-lazy
应该 return Bool
类型对象,这也将被解释为假(因为所有类型对象都被认为是 False
在布尔上下文中)。但这至少会给出一些迹象表明它确实是不确定的/不可判定的。