在下面的代码中,我试图A
通过使用var
or来获取数组的第一行和第二行ref
。在这里,我的理解是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
(作为数组类型)之间是否有一些区别......?