【问题标题】:Equality operator in favour of std.range.equal支持 std.range.equal 的等式运算符
【发布时间】:2014-02-18 09:39:05
【问题描述】:

我很好奇为什么 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

【问题讨论】:

    标签: comparison range d


    【解决方案1】:

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

    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 进行比较,因此可以处理具有可比较元素的所有输入范围。

    【讨论】:

      猜你喜欢
      • 2020-10-15
      • 1970-01-01
      • 2010-11-05
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多