Rust 泛型:期望的类型参数,找到 &T

Rust generics: expected type parameter, found &T

我是 Rust 的新手,只是涉猎而已。 我正在尝试实现一个通用队列,没有生产原因,只是熟悉该语言。

我有:

pub struct Queue<T> {
    container: Vec<T>,
}

impl<T> Queue<T> {
    pub fn new() -> Self {
        Queue {
            container: Vec::new(),
        }
    }

    pub fn enqueue(&mut self, item: T) {
        self.container.push(item);
    }

    pub fn next(&mut self) -> Option<T> {
        if self.container.is_empty() {
            return None;
        } else {
            let result = self.container.first();
            self.container.remove(0);
            return result;
        }
    }
}

我收到以下错误:

error[E0308]: mismatched types
  --> src/lib.rs:22:20
   |
5  | impl<T> Queue<T> {
   |      - this type parameter
...
16 |     pub fn next(&mut self) -> Option<T> {
   |                               --------- expected `std::option::Option<T>` because of return type
...
22 |             return result;
   |                    ^^^^^^ expected type parameter `T`, found `&T`
   |
   = note: expected enum `std::option::Option<T>`
              found enum `std::option::Option<&T>`
   = help: type parameters must be constrained to match other types
   = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters

据我了解,这里的问题是 first() returns 是对包含向量中值的引用,而不是获取所述值的副本。但是,我不太清楚如何从向量中取出任意项,并从 next() 函数中 return 它。

Rust 集合通常会返还您从中删除的元素的所有权。这是Vec::remove的情况:

pub fn remove(&mut self, index: usize) -> T

Removes and returns the element at position index within the vector, shifting all elements after it to the left.

(重点是我的)

这意味着您可以执行以下操作:

pub fn next(&mut self) -> Option<T> {
    if self.container.is_empty() {
        None
    } else {
        Some(self.container.remove(0))
    }
}

您还应该考虑使用 VecDeque which seems better suited for your case and has a pop_front,它完全符合您的要求。