Я пытаюсь собрать sh предметов в VecDeque
, но я не могу разобраться с этим. Компилятор жалуется, что мой push_back
метод в InnerQueue
impl является обобщенным c T
типом (ну, это так). Как я могу исправить код, чтобы я мог вывести sh UserItem
s в User
набранный Queue
?
use std::collections::VecDeque;
fn main() {}
struct Queue<T: InnerQueue> {
name: String,
queue: T,
}
impl<T: InnerQueue> Queue<T> {
pub fn new(name: String) -> Queue<T> {
Queue {
name,
queue: T::new(),
}
}
pub fn push<R>(&self, data: R)
where
R: QueueItem,
{
self.queue.push_back(data);
}
}
trait QueueItem {}
type UserItem = (u32, u64, u64);
impl QueueItem for UserItem {}
trait InnerQueue {
fn new() -> Self;
fn push_back<T: QueueItem>(&mut self, data: T);
}
type User = VecDeque<UserItem>;
impl InnerQueue for User {
fn new() -> Self {
VecDeque::new()
}
fn push_back<T: QueueItem>(&mut self, data: T) {
self.push_back(data);
}
}
Детская площадка
error[E0308]: mismatched types
--> src/main.rs:46:24
|
45 | fn push_back<T: QueueItem>(&mut self, data: T) {
| - this type parameter
46 | self.push_back(data);
| ^^^^ expected tuple, found type parameter `T`
|
= note: expected tuple `(u32, u64, u64)`
found type parameter `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