不能从D中的std.range中获取!

Met*_*eta 5 d phobos

我正在尝试使用切片运算符从std.range获取take函数的返回值的切片.我的代码:

auto tempChunk = ['a', 'b', 'c', 'd'];
auto a = tempChunk.take(3);
writeln(a[0..2]);
Run Code Online (Sandbox Code Playgroud)

作为Take!R在这种情况下只是char []的别名,我希望这可以编译.但是,编译器告诉我Take!(char[]) cannot be sliced with [].再举一个例子:

int[] arr1 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; 
auto s = arr.take(5);
writeln(s[0..4]);
Run Code Online (Sandbox Code Playgroud)

这将编译并运行没有问题,打印[1,2,3,4,5].在这一点上我完全感到困惑,为什么第一个例子不起作用,而第二个例子不起作用.

Mih*_*uns 5

take template使用hasSlicing来确定是否可以返回切片输入而不是Take!R struct.检查实际的返回类型使它更清晰:

import std.range, std.stdio;

void main()
{
    auto chararr = ['a', 'b', 'c', 'd'];
    auto a = chararr.take(3);
    writeln( typeid(typeof(a)) );

    auto intarr = [ 1, 2, 3, 4 ];  
    auto b = intarr.take(3);
    writeln( typeid(typeof(b)) );
}

// Output:
// std.range.Take!(char[]).Take
// int[]
Run Code Online (Sandbox Code Playgroud)

hasSlicing被明确指示为所有"窄字符串" 返回false - 那些元素可能不代表单个字符,而是代码点(char和wchar为基础的字符串).

现在,这是我猜测的开始,但我想这是为了防止使用切片意外创建格式错误的UTF-8&Co字符串.如果你在char []中没有任何实际需要,最好使用dchar [].