Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 如何调用具有泛型类型的结构的关联函数?_Rust - Fatal编程技术网

Rust 如何调用具有泛型类型的结构的关联函数?

Rust 如何调用具有泛型类型的结构的关联函数?,rust,Rust,我试图创建一个Linktrait和一个带有泛型类型的结构singlink,该泛型类型实现Link,但是当我调用结构的关联函数时,我得到了一个错误。我应该使用像vec这样的宏吗 mod Link { use std::cell::RefCell; use std::collections::VecDeque; use std::fmt::Debug; use std::rc::Rc; trait Link { type Node;

我试图创建一个
Link
trait和一个带有泛型类型的结构
singlink
,该泛型类型实现
Link
,但是当我调用结构的关联函数时,我得到了一个错误。我应该使用像
vec这样的宏吗

mod Link {
    use std::cell::RefCell;
    use std::collections::VecDeque;
    use std::fmt::Debug;
    use std::rc::Rc;

    trait Link {
        type Node;
        type Value;
        fn new(data: &mut VecDeque<Self::Value>) -> Self;
    }

    #[derive(Debug)]
    pub struct Node<T> {
        pub value: T,
        pub next: RefCell<Option<Rc<Node<T>>>>,
    }

    #[derive(Debug)]
    pub struct SinglLink<T> {
        pub header: RefCell<Option<Rc<Node<T>>>>,
        pub len: i32,
    }

    impl<T: Copy> Link for SinglLink<T> {
        type Node = Node<T>;
        type Value = T;
        fn new(data: &mut VecDeque<Self::Value>) -> Self {
            SinglLink {
                header: RefCell::new(None),
                len: 0,
            }
        }
    }
}

#[cfg(test)]
mod tests {
    use super::Link::SinglLink;
    use super::*;
    use std::cell::RefCell;
    use std::collections::VecDeque;

    #[test]
    fn it_works() {
        let mut data: VecDeque<i32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
        let single: SinglLink<i32> = SinglLink::new(&mut data);
    }
}
mod Link{
使用std::cell::RefCell;
使用std::collections::VecDeque;
使用std::fmt::Debug;
使用std::rc::rc;
性状连锁{
类型节点;
类型值;
fn新建(数据:&mut VecDeque)->Self;
}
#[导出(调试)]
发布结构节点{
pub值:T,
下一个酒吧:RefCell,
}
#[导出(调试)]
Singlink酒店{
发布标题:RefCell,
酒吧名称:i32,
}
Singlink的impl链路{
类型节点=节点;
类型值=T;
fn新建(数据:&mut VecDeque)->自{
辛格林克{
标题:RefCell::new(无),
蓝:0,
}
}
}
}
#[cfg(测试)]
模试验{
使用super::Link::singlink;
使用超级::*;
使用std::cell::RefCell;
使用std::collections::VecDeque;
#[测试]
fn it_works(){
让mut data:VecDeque=vec![1,2,3,4,5,6,7,8,9,10]。放入iter().collect();
let single:singlink=singlink::new(&mut数据);
}
}
错误消息:

error[E0599]:在当前作用域中找不到'Link::singlink'类型的名为'new'的函数或关联项
-->src/lib.rs:47:49
|
20 | Singlink酒吧结构{
|--------------------------未找到此函数的函数或关联项'new'
...
47 | let single:singlink=singlink::new(&mut数据);
|^^^在`Link::singlink'中找不到函数或关联项`
|
=帮助:只有在trait已实现且在范围内时,才能使用trait中的项
=注意:以下特征定义了一个“new”项,您可能需要实现它:
候选人#1:`Link::Link`

这里有两个小错误,使得错误消息没有多大帮助

  • 您忘记了
    trait Link
    上的
    pub
    ,因此在
    Link
    模块之外它是完全不可访问的。例如
    pub-trait Link{/*…*/}

  • 您需要
    使用
    测试
    模块中的
    链接
    特性,以使其方法在那里可用。(一旦添加
    发布
    ,编译器错误将很好地告诉您)。例如
    使用super::Link::Link;

  • 以下是您的代码的工作版本:

    mod Link {
        use std::cell::RefCell;
        use std::collections::VecDeque;
        use std::fmt::Debug;
        use std::rc::Rc;
        pub trait Link {
            type Node;
            type Value;
            fn new(data: &mut VecDeque<Self::Value>) -> Self;
        }
    
        #[derive(Debug)]
        pub struct Node<T> {
            pub value: T,
            pub next: RefCell<Option<Rc<Node<T>>>>,
        }
    
        #[derive(Debug)]
        pub struct SinglLink<T> {
            pub header: RefCell<Option<Rc<Node<T>>>>,
            pub len: i32,
        }
    
        impl<T: Copy> Link for SinglLink<T> {
            type Node = Node<T>;
            type Value = T;
            fn new(data: &mut VecDeque<Self::Value>) -> Self {
                SinglLink {
                    header: RefCell::new(None),
                    len: 0,
                }
            }
        }
    }
    
    #[cfg(test)]
    mod tests {
        use super::Link::SinglLink;
        use super::Link::Link;
        use super::*;
        use std::cell::RefCell;
        use std::collections::VecDeque;
    
        #[test]
        fn it_works() {
            let mut data: VecDeque<i32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
            let single: SinglLink<i32> = SinglLink::new(&mut data);
        }
    }
    
    mod Link{
    使用std::cell::RefCell;
    使用std::collections::VecDeque;
    使用std::fmt::Debug;
    使用std::rc::rc;
    发布特性链接{
    类型节点;
    类型值;
    fn新建(数据:&mut VecDeque)->Self;
    }
    #[导出(调试)]
    发布结构节点{
    pub值:T,
    下一个酒吧:RefCell,
    }
    #[导出(调试)]
    Singlink酒店{
    发布标题:RefCell,
    酒吧名称:i32,
    }
    Singlink的impl链路{
    类型节点=节点;
    类型值=T;
    fn新建(数据:&mut VecDeque)->自{
    辛格林克{
    标题:RefCell::new(无),
    蓝:0,
    }
    }
    }
    }
    #[cfg(测试)]
    模试验{
    使用super::Link::singlink;
    使用super::Link::Link;
    使用超级::*;
    使用std::cell::RefCell;
    使用std::collections::VecDeque;
    #[测试]
    fn it_works(){
    让mut data:VecDeque=vec![1,2,3,4,5,6,7,8,9,10]。放入iter().collect();
    let single:singlink=singlink::new(&mut数据);
    }
    }
    

    ()

    并且您首先不应该调用模块
    链接
    …请不要忽略编译器发出的警告。请解决它们。