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

Posted

技术标签:

【中文标题】如何调用具有泛型类型的结构的关联函数?【英文标题】:How to call an associated function of a struct with a generic type? 【发布时间】:2020-03-02 11:03:15 【问题描述】:

我尝试创建一个Link trait 和一个结构SinglLink,其具有实现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);
    

错误信息:

error[E0599]: no function or associated item named `new` found for type `Link::SinglLink<_>` in the current scope
  --> src/lib.rs:47:49
   |
20 |     pub struct SinglLink<T> 
   |     ----------------------- function or associated item `new` not found for this
...
47 |         let single: SinglLink<i32> = SinglLink::new(&mut data);
   |                                                 ^^^ function or associated item not found in `Link::SinglLink<_>`
   |
   = help: items from traits can only be used if the trait is implemented and in scope
   = note: the following trait defines an item `new`, perhaps you need to implement it:
           candidate #1: `Link::Link`

【问题讨论】:

请不要忽略来自编译器的警告。解决他们。 【参考方案1】:

这里有两个小错误,使错误消息不是很有帮助。

    您忘记了trait Link 上的pub,因此在Link 模块之外完全无法访问它。例如pub trait Link /* ... */

    您需要在 tests 模块中使用 use Link 特征,以便其方法在那里可用。 (一旦你添加了pub,编译器错误就会很好地告诉你)。例如use 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);
    

(Rust Playground)

【讨论】:

你不应该首先调用模块Link...

以上是关于如何调用具有泛型类型的结构的关联函数?的主要内容,如果未能解决你的问题,请参考以下文章

java 泛型 T的类型

泛型类的可选方法参数的类型

Kotlin泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )

如何通过使用类型名称来实例化泛型类?

笔记:泛型

Java 无类型泛型类,删除它们的函数泛型类型