是否将数组转换为字符串 "special" 等类型?

Is casting an array to string "special" among other types?

在此代码中,我将整数数组 arr 转换为几种不同的类型。当转换为 real 时,结果是通过将每个元素转换为 real 获得的数组。 complex 也是如此。但是如果我将 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 的结果)

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

但是,因为在I/O中使用了字符串(例如writeln(arr)),我猜测转换为字符串可能是"exceptional"或"special"等类型。如果是这样,如果 T 不是 string 并且将每个元素转换为 [=22=,那么假设 arr : T 总是给出元素类型为 T 的新数组是否合理] 有空吗?

我认为你的假设是正确的。当数组被强制转换为 string 类型时,会产生一个字符串值,因为 (a) 可以将数组表示为字符串,(b) 支持强制转换,以及 (c) 如您所述,我们需要这种能力适用于 I/O。大多数类型都是如此,因此对于这种情况 "wins" 的规则是 "expressions of arbitrary types generally support being cast to a string in Chapel."

相反,当 int 的数组转换为 real(例如)时,没有定义从数组到实数的转换。但是,有一个从 intreal 的转换定义,因此 Chapel 的数组提升规则开始生效,转换被并行应用于每个数组元素。实际上,表达式 arr: real 被重写为 [e in arr] e: real.

这也建议了一种方法,如果这是您在特定情况下想要的,您可以获得字符串结果数组:遍历数组,将每个元素转换为字符串 (TIO):

var arr = [1,2,3];
writeln( arr );
writeln( arr.type:string );

var s = [e in arr] e:string;
writeln( s );
writeln( s.type:string );

(并且这种形式应该适用于元素类型上的任何合法转换,它只是比促销启用的 shorthand 多输入一点;但在通用设置中,这可能是合适的)。