TL;DR If a non-native item is mutable via assignment, it's a Scalar
. List assignment does not flatten Scalar
items. [1]
一个暗示
考虑这段代码:
my %map = :a;
%map<a> = 42;
say %map<a>; # 42
该作业之所以有效,是因为:
say %map<a>.VAR.WHAT; # (Scalar)
“列表分配”
考虑这段代码:
my $scalar = 1,2; # Useless use of constant integer 2
say $scalar; # 1
my @list1 = 1,2; # "list assignment", so RHS is iterated
say @list1; # [1 2]
这就是项目分配和列表分配之间的区别之一。
my @list3 = [1,2]; # Again, RHS is iterated
say @list3; # [1 2]
my @list2 = (1,2); # Again, RHS is iterated
say @list2; # [1 2]
my @list4 = 1,(2,3); # Again, RHS is iterated. Second element stays as a `List`.
say @list4; # [1 (2 3)]
my @list5 = 1,[2,3]; # Again, RHS is iterated. Second element stays as an `Array`.
say @list5; # [1 [2 3]]
如果 RHS 上只列出了一项,这不是一个Scalar
,列表分配将其展平。但在所有其他情况下,列表分配不会展平项目。
my @list6 = $[1,2]; # RHS is a `Scalar`. So it doesn't get flattened.
say @list6; # [[1 2]]
我很困惑!
高尔夫Q中的情况:
my Str @res = %( :a[42,99] )<a>;
这会产生同样类型的错误。
Because:
say .VAR.WHAT given :a[42,99]<a>; # (Array)
say .VAR.WHAT given (% = :a[42,99])<a>; # (Scalar)
脚注
[1] When surmise yields surprise, and you turn that into learning, you realize and idealize your investment in ERN https://en.wikipedia.org/wiki/Error-related_negativitying.