Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何将特征类型推送到Vec中?_Rust - Fatal编程技术网

Rust 如何将特征类型推送到Vec中?

Rust 如何将特征类型推送到Vec中?,rust,Rust,我试图将项目推到向量机中,但我无法理解这一点。编译器抱怨InnerQueueimpl中的mypush_back方法是一种泛型T类型(当然,它是)。如何修复代码,以便将UserItems推入用户键入的队列 use std::collections::VecDeque; fn main() {} struct Queue<T: InnerQueue> { name: String, queue: T, } impl<T: InnerQueue> Queu

我试图将项目推到
向量机中
,但我无法理解这一点。编译器抱怨
InnerQueue
impl中的my
push_back
方法是一种泛型
T
类型(当然,它是)。如何修复代码,以便将
UserItem
s推入
用户
键入的
队列

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);
    }
}
使用std::collections::VecDeque;
fn main(){}
结构队列{
名称:String,
队列:T,,
}
impl队列{
pub fn new(名称:String)->队列{
排队{
名称
队列:T::new(),
}
}
发布fn推送(&self),数据:R)
哪里
R:QueueItem,
{
self.queue.push_back(数据);
}
}
特征队列项{}
类型UserItem=(u32、u64、u64);
UserItem{}的impl QueueItem
特征内部队列{
fn new()->Self;
fn推回(和多个自身,数据:T);
}
类型User=VecDeque;
用户的impl InnerQueue{
fn new()->Self{
VecDeque::new()
}
fn推回(&mut self,数据:T){
自我推回(数据);
}
}

错误[E0308]:类型不匹配
-->src/main.rs:46:24
|
45 | fn推回(&mut self,数据:T){
|-此类型参数
46 |自我推回(数据);
|^^^^应为元组,找到类型参数`T`
|
=注意:应为元组“”(u32、u64、u64)`
找到类型参数`T`
=帮助:必须约束类型参数以匹配其他类型
=注:有关更多信息,请访问https://doc.rust-lang.org/book/ch10-02-traits.html#traits-作为参数

您可能可以使用一个关联的类型,并删除
QueueItem
特征:(没有正确考虑这个问题,所以不要将其作为答案发布。)一般来说,思考一下在您的
push_back
实现中会发生什么情况会对不同的
T
类型调用多次。但更具体地说,显示了一个非常类似的问题。您的问题可能会由的答案回答。如果不是,请您的问题解释差异。否则,我们可以将此问题标记为已回答。这是否回答了您的问题?您可能可以使用关联类型并删除
QueueItem
特征:(未正确考虑此问题,因此不将此作为答案发布。)一般来说,思考一下在您的
push_back
实现中会发生什么情况会对不同的
T
类型调用多次。但更具体地说,显示了一个非常类似的问题。您的问题可能会由的答案回答。如果不是,请您的问题解释差异。否则,我们可以将此问题标记为已回答。这是否回答了您的问题?