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

标签 rust

我试图创建一个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 {/* ... */}

  2. 您需要在 tests 模块中使用 Link 特性,以便它的方法在那里可用。 (添加 pub 后,编译器错误会很好地告诉您)。例如使用 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 )

关于rust - 如何调用具有泛型类型的结构的关联函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58722076/

相关文章:

rust - 在两个单独的向量中创建对 rust 字符串的引用

tuples - 玩转 Rust 的元组

rust - 我应该在哪里使用 &v : &V to describe a parameter in function signatures?

rust - 如何使用 Diesel 编写多个显式的 inner_join?

process - 执行任何 bash 命令,立即获取 stdout/stderr 的结果并使用 stdin

rust - 将闭包指定为返回类型的替代方法?

Rust - 创建 HashMap ,它使用它从迭代器存储的部分数据

iterator - 如何设置盒装闭包捕获 `self` 的生命周期?

git - 我可以在 git 存储库中添加一个作为子目录的依赖包吗?

rust - 如何为私有(private)项目生成文档