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数据);
}
}
()并且您首先不应该调用模块链接
…请不要忽略编译器发出的警告。请解决它们。