Rust 是否有任何理由不将DoubleEndeditor用于不使用';你不能重复一系列的事情吗?

Rust 是否有任何理由不将DoubleEndeditor用于不使用';你不能重复一系列的事情吗?,rust,Rust,据我所知,它适用于迭代一系列项的迭代器,可以从任意一端开始。例如,(1..10)可以实现从1到10,或者从10到1。然而,我有一种情况,对于一个迭代器来说,使用这个特性是很有用的,它不迭代一系列的东西,而是可以从相同的位置向前或向后,如下所示: struct ExtremeIterator { number: i32 } impl Iterator for ExtremeIterator { type Item = i32; fn next(&mut self

据我所知,它适用于迭代一系列项的迭代器,可以从任意一端开始。例如,
(1..10)
可以实现从1到10,或者从10到1。然而,我有一种情况,对于一个迭代器来说,使用这个特性是很有用的,它不迭代一系列的东西,而是可以从相同的位置向前或向后,如下所示:

struct ExtremeIterator {
    number: i32
}

impl Iterator for ExtremeIterator {
    type Item = i32;

    fn next(&mut self) -> Option<i32> {
        let result = self.number;
        self.number += 1;
        Some(result)
    }
}

impl DoubleEndedIterator for ExtremeIterator {
    fn next_back(&mut self) -> Option<i32> {
        let result = self.number;
        self.number -= 1;
        Some(result)
    }
}

fn main() {
    let iter = ExtremeIterator { number: 10 };

    for i in iter.rev().take(5) {
        println!("{}", i);
    }
}
结构极值运算符{
编号:i32
}
极值迭代器的impl迭代器{
项目类型=i32;
fn下一步(&mut self)->选项{
让结果=自我编号;
self.number+=1;
一些(结果)
}
}
ExtremeIterator的impl DoubleEndeditor{
fn下一步返回(&mut self)->选项{
让结果=自我编号;
self.number-=1;
一些(结果)
}
}
fn main(){
设iter=ExtremeIterator{number:10};
对于iter.rev()中的i,取(5){
println!(“{}”,i);
}
}

所以我的问题是:这样使用
doubleEndediter
在语义上有什么错误吗?是否有一些原因可以解释为什么将其用于与文档中所述不同的目的是一个坏主意?还有,有没有更好的方法来实现同样的目标?

首先,让我们澄清一下你问题中的这句话:

例如,(1..10)可以实现从1到10,或者从10到1

1..10
是一种类型,它按顺序1、2、3、4、5、6、7、8、9迭代,而不管您是从后面还是前面迭代。从后面,你得到9,8,…,从前面,你得到1,2。。。;它是一个包含开始和结束的独占范围,也称为半开放范围

如果从前面开始迭代一段距离,然后从后面迭代一段距离,它将在端点相交处停止:

let mut range = 1..10;

for i in &mut range {
    // Produce 1, 2, 3, 4, 5
    // then break.
    if i == 5 { break; }
}

for j in range.rev() {
    // Produces 9, 8, 7, 6
}
这显示了一个性能良好的双端迭代器是什么样子的


现在,关于“滥用”的问题:

这是有问题的

问题很清楚:

能够从两端产生元素的范围迭代器

doubleEndedeter
可以被认为是一个缺陷,因为
next()
next\u back()
从同一范围排出元件,并且不能相互独立工作。

您必须理解这一点:无论是使用
next
next\u back
,还是这些元素的组合,任何遍历都必须生成相同范围的元素,如果您跟踪它们(并跟踪它们来自哪一端)

然而,有无限范围的情况

在无限长的范围内,目标永远不会达到。这种迭代器的一个例子是。对于这个简单的例子,很容易看出迭代器是无限的原因,以及
next()
next\u back()
是如何逻辑定义的

这是一个漏洞,您可以将迭代器的序列指定为无限长,尽管是双端的。我认为用我们固定的位宽整数来正确实现这个接口是有问题的


即使有可疑的哲学动机,它也可能是一个非常令人困惑的迭代器,违背了合理的期望。我认为错误地使用trait(比如迭代器有两个完全不一致的端点)是很可怕的,但是如果有一个取之不尽的范围,你实际上不会破坏任何trait属性。

谢谢。。我以前没有考虑过可以同时使用同一迭代器的正向和反向形式。现在你知道什么是双端范围了!