Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 正在将数组强制转换为字符串";特别";在其他类型中?_Arrays_String_Casting_Chapel - Fatal编程技术网

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
的转换可用,这是否合理?

我认为你的假设是正确的。当一个数组被强制转换为type
string
时,会产生一个字符串值,因为(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 );