不能在 char 数组上使用 parallel?
Cannot use parallel on a char array?
我在 D 的在线游览和本地的 ldc 上都尝试过这个。这个错误让我很困惑。
与 int 相比,char 有什么特别之处,以至于它不能成为并行引用?
import std.stdio : writeln;
import std.parallelism;
void main()
{
auto arr = [1,2,3,4,5,6,7,8];
foreach(ref i; parallel(arr)) {
//writeln(typeid(i));
i = i*i;
}
writeln(arr);
auto result = [ 'w','e','l','c','o','m','e','t','o','d'];
//foreach( ref c; parallel(result)) --> Error: foreach: cannot make c ref
foreach( ref c; result)
{
//writeln(typeid(c));
c = 'a';
}
writeln(result);
writeln(typeid(arr));
writeln(typeid(result));
}
char
有点像部分类型——它代表一段 unicode 字符,而不是整个字符。考虑汉字维——它在内存中的表示是 E7 BB B4
,或者三个 char
的数组。因此,D 不允许您以与其他类型相同的方式对 char
进行操作。
D 没有单独的 ASCII 文本类型,所以如果你想将字符串视为 ASCII,你应该使用 ubyte[]
而不是 char[]
。
默认情况下,Phobos 将 char 数组视为 dchar 的双向范围。要覆盖它,请使用 std.utf.byCodeUnit。 https://dlang.org/library/std/utf/by_code_unit.html
我在 D 的在线游览和本地的 ldc 上都尝试过这个。这个错误让我很困惑。 与 int 相比,char 有什么特别之处,以至于它不能成为并行引用?
import std.stdio : writeln;
import std.parallelism;
void main()
{
auto arr = [1,2,3,4,5,6,7,8];
foreach(ref i; parallel(arr)) {
//writeln(typeid(i));
i = i*i;
}
writeln(arr);
auto result = [ 'w','e','l','c','o','m','e','t','o','d'];
//foreach( ref c; parallel(result)) --> Error: foreach: cannot make c ref
foreach( ref c; result)
{
//writeln(typeid(c));
c = 'a';
}
writeln(result);
writeln(typeid(arr));
writeln(typeid(result));
}
char
有点像部分类型——它代表一段 unicode 字符,而不是整个字符。考虑汉字维——它在内存中的表示是 E7 BB B4
,或者三个 char
的数组。因此,D 不允许您以与其他类型相同的方式对 char
进行操作。
D 没有单独的 ASCII 文本类型,所以如果你想将字符串视为 ASCII,你应该使用 ubyte[]
而不是 char[]
。
默认情况下,Phobos 将 char 数组视为 dchar 的双向范围。要覆盖它,请使用 std.utf.byCodeUnit。 https://dlang.org/library/std/utf/by_code_unit.html