平等运算符支持std.range.equal

Nor*_*löw 5 comparison d range

我很好奇为什么D开发人员std.range.equal在诸如此类的情况下推广使用

bool isPalindrome(Range)(in Range range) if 
(isBidirectionalRange!Range)
{
    return range.retro.equal(range);
}
Run Code Online (Sandbox Code Playgroud)

为什么不==使用此处使用等式运算符?

另见:http://forum.dlang.org/thread/qdamjxisavsizvrdpecf@forum.dlang.org#post-qdamjxisavsizvrdpecf:40forum.dlang.org

Jon*_*vis 8

等于运算符用于比较相同类型的对象,而范围通常具有截然不同的类型.

auto result = range1.equal(range2);
Run Code Online (Sandbox Code Playgroud)

将两个输入范围进行比较,无论它们是什么类型,只要它们的元素可以进行比较,而

auto result = range1 == range2;
Run Code Online (Sandbox Code Playgroud)

要求两个范围是相同的类型,这种情况很少发生.目前,甚至有很多情况下应该被认为是相同类型的两个范围不是,因为语言无法比较lambda函数以查看它们是否是相同的函数(远离字符串lambda的严重缺点)和我们一样,因为可以比较字符串的相等性.希望这将在未来得到补救,但==即使您愿意,它也经常使得比较范围变得困难.

此外,==它不属于范围API支持的操作集.range1 == range2如果两个范围属于同一类型(因为==是为所有类型定义的),将编译,但它们可以比较引用相等或进行更深入的比较.这完全取决于范围的实施.输入范围所需的全部是此代码编译:

{
    R r = void;       // can define a range object
    if (r.empty) {}   // can test for empty
    r.popFront();     // can invoke popFront()
    auto h = r.front; // can get the front of the range
}
Run Code Online (Sandbox Code Playgroud)

R范围类型在哪里.输入范围没有其他要求.因此,您不能依赖于==为它们工作,而equal使用输入范围API进行比较,因此可以使用可以比较的元素的所有输入范围.