在下面的代码中,我试图通过使用var
或ref
来获取数组A
的第1行和第2行。在这里,我的理解是,var
总是创建一个新的数组,而ref
创建一个别名(或引用)到右侧。意外的类型从一个二维数组切片
var A: [1..2, 1..3] int;
A = 0;
var row1 = A[ 1, .. ];
ref row2 = A[ 2, .. ];
row1 = 10;
row2 = 20;
writeln("row1 = ", row1);
writeln("row2 = ", row2);
writeln("A = ", A);
结果如预期(即,A
第一行不修改):
row1 = 10 10 10
row2 = 20 20 20
A = 0 0 0
20 20 20
但如果我打印的row1
类型和row2
writeln("row1.type = ", row1.type: string);
writeln("row2.type = ", row2.type: string);
我得到这个结果:
row1.type = [ArrayViewRankChangeDom(1,int(64),false,2*bool,2*int(64),ArrayViewRankChangeDist(DefaultDist,2*bool,2*int(64)))] int(64)
row2.type = [ArrayViewRankChangeDom(1,int(64),false,2*bool,2*int(64),ArrayViewRankChangeDist(DefaultDist,2*bool,2*int(64)))] int(64)
这有点令人惊讶,因为我假定row1
是一个“通常”数组(即不是别名)。例如,以下vec
(我称之为一个“通常”的阵列)
var vec: [1..3] int;
writeln("vec.type = ", vec.type: string);
给出
vec.type = [domain(1,int(64),false)] int(64)
所以我想知道是否有row1
和vec
之间的一些差异(如数组类型) ...?