一个随机存取、有长度但不麻烦的D范围?

一个随机存取、有长度但不麻烦的D范围?,d,D,在Phobos中实施findSplit时,我们有: 这里的大部分约束都是合理的。我知道我们需要一个随机访问的范围,haystack和needle都需要一个大小。但是,hasSlicing检查令我惊讶 我希望RandomAccess和hasLength的任何范围都能够支持切片。是否有一个示例范围本质上无法支持切片,尽管它是随机访问和hasLength 或者这更像是一个用户可能出于某种原因而选择不实施特定操作的范围的问题吗?我带着这个直接找到了来源,并在Twitter上询问了Andrei Alexa

在Phobos中实施
findSplit
时,我们有:

这里的大部分约束都是合理的。我知道我们需要一个随机访问的范围,
haystack
needle
都需要一个大小。但是,
hasSlicing
检查令我惊讶

我希望
RandomAccess
hasLength
的任何范围都能够支持
切片
。是否有一个示例范围本质上无法支持
切片
,尽管它是
随机访问
hasLength


或者这更像是一个用户可能出于某种原因而选择不实施特定操作的范围的问题吗?

我带着这个直接找到了来源,并在Twitter上询问了Andrei Alexandrescu:

我不认为有一个有趣的例子,没有切片的随机访问范围(反之亦然)。当我们引入范围时,我们希望尽可能的通用,但结果证明这是过度工程化的


我认为你的假设是正确的。范围基本上只是自定义结构和类上的函数约定。因此,对于某些范围结构,可以实现RandomAccess“接口”和长度,但不能实现切片“接口”。随机访问范围定义为额外提供
opIndex
的双向范围。双向范围是一种向前范围,它还提供
back
popBack
。前向范围是一个输入范围,它还提供
保存
,输入范围提供
前向
前向
。火卫一是通用的,所以它实现了这样的东西。
static if (isSomeString!R1 && isSomeString!R2
        || (isRandomAccessRange!R1 && hasSlicing!R1 && hasLength!R1 && hasLength!R2))
{
    auto balance = find!pred(haystack, needle);
    immutable pos1 = haystack.length - balance.length;
    immutable pos2 = balance.empty ? pos1 : pos1 + needle.length;
    return Result!(typeof(haystack[0 .. pos1]),
                   typeof(haystack[pos2 .. haystack.length]))(haystack[0 .. pos1],
                                                              haystack[pos1 .. pos2],
                                                              haystack[pos2 .. haystack.length]);
}