D 无法在字符数组上使用并行?

D 无法在字符数组上使用并行?,d,D,我在D的在线旅行和当地的ldc上都尝试过这一点。这个错误使我困惑。 与int相比,char有什么特别之处,以至于它不能从parallel变成ref 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

我在D的在线旅行和当地的ldc上都尝试过这一点。这个错误使我困惑。 与int相比,char有什么特别之处,以至于它不能从parallel变成ref

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字符的一部分,而不是整个字符。考虑汉字维 - 它在内存中的表示形式是
e7bbb4
,或三个
char
s的数组。因此,D不允许您以与其他类型相同的方式对
char
进行操作


D没有单独的ASCII文本类型,因此如果要将字符串视为ASCII,则应使用
ubyte[]
而不是
char[]

默认情况下,Phobos将char数组视为dchar的双向范围。要覆盖该值,请使用std.utf.byCodeUnit

哼唱,以防止在给定位置平行分裂。这就是为什么普通foreach可以工作但不能并行?这并不能阻止代码点的拆分,您可能会在不同线程之间拆分多个单元代码点。然而,foreach是一种语言特性。该语言将字符数组视为具有切片和索引的数组。Phobos不依赖于语言,而是对字符数组有自己的看法。e、 g.
hasLength!(字符串)=false,但
“hello”。长度==5
。这就是所谓的自动解码问题,在D中有点混乱。