无法切片从D

  • 本文关键字:切片 d phobos
  • 更新时间 :
  • 英文 :


我正在尝试使用切片操作员从std.range获取take函数的返回值的切片。我的代码:

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

在这种情况下,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]);

这将毫无问题地编译和运行,打印[1,2,3,4,5]。在这一点上,我完全感到困惑,为什么第一个示例不起作用,而第二个示例也很困惑。

模板使用 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[]

hasslicing 明确指示所有"窄字符串"返回 false - 那些元素可能不代表单个字符,而是一个代码点(Char和WCHAR基于WARH))。

现在,这是我的猜测开始的地方,但我想这是为了防止意外创建畸形的UTF-8&使用切片串。如果您在char []中没有任何真正的需求,最好使用dchar []。

相关内容

  • 没有找到相关文章

最新更新