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
,它完全符合您的要求。
我是 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
,它完全符合您的要求。