gpt4 book ai didi

arrays - Raku 列表添加运算符 `Z+` 'fails' 除非强制列表之一

转载 作者:行者123 更新时间:2023-12-04 04:25:02 25 4
gpt4 key购买 nike

我很难理解为什么 zip-add Z+运算符在某些情况下不起作用。
我有一些我想总结的 2 元素列表。
无论我使用列表还是数组,这些都按预期工作:

say (1, 2) Z+ (3, 4) # (4, 6)
say [1, 2] Z+ (3, 4) # (4, 6)
say [1, 2] Z+ [3, 4] # (4, 6)
say (1, 2) Z+ [3, 4] # (4, 6)
现在我们将做同样的事情,但我将使用存储在其他地方的值更改正确的操作数。在这种情况下,我有一个列表数组:
my @foo = (1,1), (2,2);
say @foo.WHAT; # (Array)
say @foo[1].WHAT; # (List)
say @foo[1]; # (2,2)
say (3,3) Z+ @foo[1]; # (5) ???
这给出了 (5) 的意外结果(至少对我来说:)) .
有几种方法可以解决这个问题。
第一个是强制得到的元素是一个列表:
my @foo = (1,1), (2,2);
say @foo.WHAT; # (Array)
say @foo[1].WHAT; # (List) <== It was already a list, but...
say @foo[1]; # (2,2)
say (3,3) Z+ @foo[1].list; # <== changed. (5,5)
另一种是更改 @foo定义为列表而不是数组(通过 is List 或绑定(bind) := 值)
my @foo is List = (1,1), (2,2);   # <=== Changed
say @foo.WHAT; # (Array)
say @foo[1].WHAT; # (List) <== It was already a list
say @foo[1]; # (2,2)
say (3,3) Z+ @foo[1]; # (5,5)
为什么第一个案例不起作用?

最佳答案

如果您删除 +来自 Z ,而您使用 dd而不是 say ,它可能会变得更清楚:

dd (3,3) Z @foo[1];  # ((3, $(2, 2)),).Seq
所以在这种情况下,你会得到一个列表 3(2,2) .注意 $(2,2) 之前:这意味着它是逐项列出的:被视为单个项目。
现在与 Z+ ,而不是创建列表,您将添加值。
当你写:
say 3 + (42,666);    # 5
你得到 5因为您将列表中的元素数添加到 3 .这就是为什么你要结束 5在你的例子中, 不是 因为列表中的值为 2 .
在其他情况下, Z运算符会看到非逐项列表,因此将按照您的预期迭代其元素。
如有疑问,请确保使用 dd而不是 say在调试中:它会给你一个表达式的本质,而不仅仅是一个“要点”:-)

关于arrays - Raku 列表添加运算符 `Z+` 'fails' 除非强制列表之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65304156/

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