Raku 混淆后缀 ,= 运算符行为
Raku confusing postfix ,= operator behavior
这个 raku documentation page 说运算符 ,=
应该连接
the contents of the variable on the left hand side and the expression on the right hand side
以 class 依赖的方式。该文档还提供了一个带有 Hash
变量的示例:
my %a = :11a, :22b;
%a ,= :33x;
say %a # OUTPUT: «{a => 11, b => 22, x => 33}»
这对我有用,但是当我尝试对 Array
做同样的事情时,发生了一些令人困惑的事情:
my @a = 1, 2;
@a ,= 3;
say @a
输出类似于 (\Array_94393785458840 = [Array_94393785458840 3])
。我希望结果是 [1, 2, 3]
.
我的问题是:这是预期的行为吗?如果是这样,那么这样操作的目的是什么?
foo ,= bar
是
的缩写
foo = foo, bar
所以,
@a ,= 3
是以下简称:
@a = @a, 3;
2015年Great List Refactor期间,单参数规则到处活跃。由于表达式的右侧是 not 单个参数,因此右侧的 @a
将 not 变平.
如此有效,您正在创建一个自引用数组,其中第一个元素引用自身(这就是 say
试图告诉您的内容)。
由于我不太清楚的原因,不同样适用于执行关联角色的对象。所以在那种情况下,%a
does 会变平,从而将给定的 Pair
添加到哈希中。
my %a = :11a, :22b;
%a = %a, :33x;
say %a # OUTPUT: «{a => 11, b => 22, x => 33}»
回到你的问题:在数组的情况下,我认为 ,=
操作没有多大用处。在 Great List Refactor 之前,它可能已经达到了你的预期。但这与其他情况不一致,一致性被认为更重要(因为在 Great List Refactor 之前,什么时候会变平,什么时候不会变平,是相当随意的,很多时候是 WAT 而不是 DWIM 的来源)。
对于那些不太熟悉 raku 的人来说,很容易用像这样的滑动“|”来展平任何数组......@a = |@a, :33;
(以额外的运算符为代价)
这个 raku documentation page 说运算符 ,=
应该连接
the contents of the variable on the left hand side and the expression on the right hand side
以 class 依赖的方式。该文档还提供了一个带有 Hash
变量的示例:
my %a = :11a, :22b;
%a ,= :33x;
say %a # OUTPUT: «{a => 11, b => 22, x => 33}»
这对我有用,但是当我尝试对 Array
做同样的事情时,发生了一些令人困惑的事情:
my @a = 1, 2;
@a ,= 3;
say @a
输出类似于 (\Array_94393785458840 = [Array_94393785458840 3])
。我希望结果是 [1, 2, 3]
.
我的问题是:这是预期的行为吗?如果是这样,那么这样操作的目的是什么?
foo ,= bar
是
的缩写foo = foo, bar
所以,
@a ,= 3
是以下简称:
@a = @a, 3;
2015年Great List Refactor期间,单参数规则到处活跃。由于表达式的右侧是 not 单个参数,因此右侧的 @a
将 not 变平.
如此有效,您正在创建一个自引用数组,其中第一个元素引用自身(这就是 say
试图告诉您的内容)。
由于我不太清楚的原因,不同样适用于执行关联角色的对象。所以在那种情况下,%a
does 会变平,从而将给定的 Pair
添加到哈希中。
my %a = :11a, :22b;
%a = %a, :33x;
say %a # OUTPUT: «{a => 11, b => 22, x => 33}»
回到你的问题:在数组的情况下,我认为 ,=
操作没有多大用处。在 Great List Refactor 之前,它可能已经达到了你的预期。但这与其他情况不一致,一致性被认为更重要(因为在 Great List Refactor 之前,什么时候会变平,什么时候不会变平,是相当随意的,很多时候是 WAT 而不是 DWIM 的来源)。
对于那些不太熟悉 raku 的人来说,很容易用像这样的滑动“|”来展平任何数组......@a = |@a, :33;
(以额外的运算符为代价)