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

时间:2014-02-18 09:39:06

标签: comparison range d

我很好奇为什么D开发人员在

等案例中推广使用std.range.equal
bool isPalindrome(Range)(in Range range) if 
(isBidirectionalRange!Range)
{
    return range.retro.equal(range);
}

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

另请参阅:http://forum.dlang.org/thread/qdamjxisavsizvrdpecf@forum.dlang.org#post-qdamjxisavsizvrdpecf:40forum.dlang.org

1 个答案:

答案 0 :(得分:8)

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

auto result = range1.equal(range2);

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

auto result = range1 == range2;

要求两个范围属于同一类型,这种情况很少发生。目前,甚至有很多情况下应该被认为是相同类型的两个范围不是,因为语言无法比较lambda函数以查看它们是否是相同的函数(严重的)因为我们一直在远离字符串lambdas,所以因为字符串可以进行相等比较)。希望将来可以解决这个问题,但即使您愿意,也常常会使范围与==比较困难。

此外,==不属于范围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
}

其中R是范围类型。输入范围没有其他要求。因此,您不能依赖==为它们工作,而equal使用输入范围API进行比较,因此将使用包含可比较元素的所有输入范围。