我很好奇为什么D开发人员在
等案例中推广使用std.range.equal
bool isPalindrome(Range)(in Range range) if
(isBidirectionalRange!Range)
{
return range.retro.equal(range);
}
为什么不使用此处使用等于运算符==
?
答案 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进行比较,因此将使用包含可比较元素的所有输入范围。