Arrays 正在将数组强制转换为字符串";特别";在其他类型中?
在这段代码中,我将整数数组Arrays 正在将数组强制转换为字符串";特别";在其他类型中?,arrays,string,casting,chapel,Arrays,String,Casting,Chapel,在这段代码中,我将整数数组arr转换为几种不同的类型。当强制转换为real时,结果是通过将每个元素强制转换为real获得的数组。对于复杂的,情况也是如此。但是如果我将arr转换为string,结果将成为string的标量变量。这对我来说有点惊讶,因为我最初期望一个字符串数组 var arr = [1,2,3]; writeln( arr ); writeln( arr.type:string ); var r = arr : real; writeln( r ); writeln( r.typ
arr
转换为几种不同的类型。当强制转换为real
时,结果是通过将每个元素强制转换为real
获得的数组。对于复杂的,情况也是如此。但是如果我将arr
转换为string
,结果将成为string
的标量变量。这对我来说有点惊讶,因为我最初期望一个字符串数组
var arr = [1,2,3];
writeln( arr );
writeln( arr.type:string );
var r = arr : real;
writeln( r );
writeln( r.type:string );
var z = arr : complex;
writeln( z );
writeln( z.type:string );
var s = arr : string;
writeln( s );
writeln( s.type:string );
(结果与chpl-1.20一致)
然而,由于字符串用于I/O(例如,
writeln(arr)
),我猜转换到字符串可能是其他类型中的“例外”或“特殊”。如果是这样的话,假设arr:T
总是给出一个新的元素类型数组T
,如果T
不是string
,并且每个元素到T
的转换可用,这是否合理?我认为你的假设是正确的。当一个数组被强制转换为typestring
时,会产生一个字符串值,因为(a)可以将数组表示为字符串,(b)支持该强制转换,以及(c)正如您所注意到的,我们需要这种功能来处理I/O之类的事情。大多数类型都是这样,因此在这种情况下“获胜”的规则是“任意类型的表达式通常支持转换为字符串。”
相反,当int
数组被强制转换为real
(比如)没有从数组到实数的强制转换。但是,有一个从int
到real
的强制转换,因此Chapel的数组提升规则生效,强制转换并行应用于每个数组元素。实际上,表达式arr:real
被重写为[e in arr]e:real
这还建议了一种方法,如果这是您在特定情况下想要的,那么您可以获得字符串结果数组:迭代数组,将每个元素强制转换为string():
(这个表单应该对元素类型的任何合法强制转换都是一致的,它只是比升级所允许的速记多了一点;但是在一般设置中,这可能是合适的)
1.0 2.0 3.0
[domain(1,int(64),false)] real(64)
1.0 + 0.0i 2.0 + 0.0i 3.0 + 0.0i
[domain(1,int(64),false)] complex(128)
1 2 3
string
var arr = [1,2,3];
writeln( arr );
writeln( arr.type:string );
var s = [e in arr] e:string;
writeln( s );
writeln( s.type:string );