Raku 混淆后缀 ,= 操作符行为

gmo*_*kin 7 operators raku

这个raku 文档页面说操作员,=应该连接

左侧变量的内容和右侧的表达式

以类相关的方式。该文档还提供了一个带有Hash变量的示例:

my %a = :11a, :22b;
%a ,= :33x;
say %a # OUTPUT: «{a => 11, b => 22, x => 33}?»
Run Code Online (Sandbox Code Playgroud)

这对我有用,但是当我尝试为Array一些令人困惑的事情做同样的事情时:

my @a = 1, 2;
@a ,= 3;
say @a 
Run Code Online (Sandbox Code Playgroud)

输出类似于(\Array_94393785458840 = [Array_94393785458840 3]). 然而,我希望结果是[1, 2, 3]

我的问题是:这是预期的行为吗?如果是这样,这种操作的目的是什么?

Eli*_*sen 10

foo ,= bar
Run Code Online (Sandbox Code Playgroud)

是简称

foo = foo, bar
Run Code Online (Sandbox Code Playgroud)

所以,

@a ,= 3
Run Code Online (Sandbox Code Playgroud)

简称:

@a = @a, 3;
Run Code Online (Sandbox Code Playgroud)

在 2015 年的 Great List Refactor 中,单参数规则无处不在。由于表达式的右侧不是单个参数,@a因此右侧的不会变平。

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

至于原因,我不大清楚了,同样也不能适用于做关联作用的对象。因此,在这种情况下,%a 确实会变平,从而将给定添加Pair到哈希中。

my %a = :11a, :22b;
%a = %a, :33x;
say %a # OUTPUT: «{a => 11, b => 22, x => 33}?»
Run Code Online (Sandbox Code Playgroud)

回到你的问题:在数组的情况下,我认为该,=操作没有多大用处。在 Great List 重构之前,它可能已经完成了您的预期。但是它会与其他情况不一致,并且一致性被认为更重要(因为在 Great List Refactor 之前,什么时候会变平,什么时候不会变平,这是相当武断的,而且很多时候是 WAT 而不是 DWIM 的来源)。