Raku 令人困惑的后缀 ,= 运算符行为



这个 raku 文档页面说运算符,=应该连接

左侧是变量的内容,右侧是表达式

以依赖于类的方式。该文档还提供了一个带有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 年的大列表重构期间,单参数规则在任何地方都变得活跃。 由于表达式的右侧不是单个参数,因此右侧的@a不会被展平。

如此有效地,你正在创建一个自引用数组,其中第一个元素引用自身(这是say试图告诉你的(。

由于我不太清楚的原因,这同样不适用于执行关联角色的对象。因此,在这种情况下,%a确实会被展平,从而将给定的Pair添加到哈希中。

my %a = :11a, :22b;
%a = %a, :33x;
say %a # OUTPUT: «{a => 11, b => 22, x => 33}␤»

回到你的问题:在数组的情况下,我认为,=操作没有多大用处。 在大列表重构之前,它可能已经完成了您的预期。 但它与其他情况不一致,一致性被认为更重要(因为在大列表重构之前,当某些东西会扁平化时,当某些东西不会扁平化时,是相当武断的,很多时候是 WAT 而不是 DWIM 的来源(。

对于那些不太熟悉 raku 的人来说,很容易像这样用滑动"|"展平任何数组......@a = |@a, :33;(以额外操作员为代价(

最新更新