gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:28:11 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com