簡體   English   中英

我如何編寫一個通用迭代器,該迭代器在不使用克隆的情況下保持狀態並返回值?

[英]How do I write a generic iterator that keeps a state and returns a value without using clone?

我試圖編寫一個通用的迭代器,但是如果不使用clone ,我看不到如何返回值。 有什么方法可以next函數中創建變量並返回引用? 如果我更換Tu32 ,然后我就可以返回Some(self.count)但是使用泛型,這是不可能的。

use num_traits::Num;
use std::clone::Clone;

struct Counter<T>
where
    T: Num + Clone,
{
    count: T,
}

impl<T> Counter<T>
where
    T: Num + Clone,
{
    fn new() -> Counter<T> {
        Counter { count: T::zero() }
    }
}

impl<T> Iterator for Counter<T>
where
    T: Num + Clone,
{
    type Item = T;

    fn next(&mut self) -> Option<Self::Item> {
        self.count = self.count.clone() + T::one();
        Some(self.count.clone())
    }
}

fn main() {
    let mut number: Counter<u32> = Counter::new();

    match number.next() {
        Some(x) => println!("Number {}", x),
        None => println!("Invalid"),
    }
}

一方面...不,您不能使迭代器返回對計數器值的引用。 Iterator::next()方法返回的值與接收器值&mut self沒有生命周期的關系,因此我們無法控制在那里返回的引用的生命周期。 這是必需的,因為當該引用借用該值時我們無法對其進行修改。 在另一個問題中可以更好地解釋這種擔憂。

另一方面 ,真正的擔憂出現在這里:

如果我更換Tu32 ,然后我就可以返回Some(self.count)但是使用泛型,這是不可能的。

這是唯一的情況,因為u32實現了Copy ,這意味着它在需要時u32被復制。 實現Copy類型還實現了Clone ,它將與非復制上下文中發生的復制做幾乎相同的事情。

因此,您在其中進行的克隆操作是合理的,因為您希望在仍擁有其自身狀態的同時返回計數器的值。 當該計數器的T是原始整數(例如u32 ,副本的價格與該整數的副本一樣便宜。

除此之外,您可以在AddAssign<T>上為T添加一個約束,以便可以使用+=運算符來遞增內部狀態。

impl<T> Iterator for Counter<T> where T: Num + Clone + AddAssign<T> {
    type Item = T;

    fn next(&mut self) -> Option<Self::Item> {
        self.count += T::one();
        Some(self.count.clone())
    }
}

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM