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