【发布时间】:2014-02-18 09:39:05
【问题描述】:
我很好奇为什么 D 开发人员会在诸如此类的情况下提倡使用std.range.equal
bool isPalindrome(Range)(in Range range) if
(isBidirectionalRange!Range)
{
return range.retro.equal(range);
}
为什么这里不使用相等运算符==?
【问题讨论】:
标签: comparison range d
我很好奇为什么 D 开发人员会在诸如此类的情况下提倡使用std.range.equal
bool isPalindrome(Range)(in Range range) if
(isBidirectionalRange!Range)
{
return range.retro.equal(range);
}
为什么这里不使用相等运算符==?
【问题讨论】:
标签: comparison range d
相等运算符用于比较相同类型的对象,而范围通常具有截然不同的类型。
auto result = range1.equal(range2);
将比较两个输入范围,无论它们是什么类型,只要它们的元素可以被比较,而
auto result = range1 == range2;
将要求这两个范围是同一类型,这种情况很少见。目前,甚至很多情况下应该认为是同一类型的两个范围不是,因为语言无法比较 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
}
其中R 是范围类型。对输入范围没有其他要求。因此,您不能依赖 == 为它们工作,而 equal 使用输入范围 API 进行比较,因此可以处理具有可比较元素的所有输入范围。
【讨论】: