是否将数组转换为字符串 "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
(例如)时,没有定义从数组到实数的转换。但是,有一个从 int
到 real
的转换定义,因此 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 多输入一点;但在通用设置中,这可能是合适的)。
在此代码中,我将整数数组 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
(例如)时,没有定义从数组到实数的转换。但是,有一个从 int
到 real
的转换定义,因此 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 多输入一点;但在通用设置中,这可能是合适的)。