gpt4 book ai didi

d - 不能从 D 中的 std.range 切片 Take!R?

转载 作者:行者123 更新时间:2023-12-04 11:34:29 27 4
gpt4 key购买 nike

我正在尝试使用切片运算符从 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 结构。检查实际的返回类型使它更清楚一点:

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 的那些)。

现在,这是我的推测开始的地方,但我想这样做是为了防止使用切片意外创建格式错误的 UTF-8 & Co 字符串。如果您对 char[] 没有任何实际需求,最好使用 dchar[]。

关于d - 不能从 D 中的 std.range 切片 Take!R?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13014999/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com