我有一些代码可以正常使用,但是当我添加泛型时会抛出错误。
它给出了以下错误,我的代码如下:
类型未实施特征
core::fmt::Display
[E0277]T
fn own<T>(x: T) -> T
{
x
}
struct Node<T>
{
value: T,
next: Option<Box<Node<T>>>
}
impl<T> Node<T>
{
fn print(&self)
{
let mut current = self;
loop {
println!("{}", current.value);
match current.next {
Some(ref next) => { current = &**next; },
None => break,
}
}
}
fn add(&mut self, node: Node<T>)
{
let item = Some(Box::new(node));
let mut current = self;
loop {
match own(current).next {
ref mut slot @ None => { *slot = item; return },
Some(ref mut next) => current = next
}
}
}
}
fn main() {
let leaf = Node { value: 10, next: None };
let branch = Node { value : 50, next: Some(Box::new(leaf)) };
let mut root = Node { value : 100, next: Some(Box::new(branch)) };
root.print();
let new_leaf = Node { value: 5, next: None };
root.add(new_leaf);
root.print();
}
我知道这是所有语言中泛型的常见错误,但是当我尝试向泛型添加约束时,我得到另一个错误:
<anon>:12:8: 12:26 error: failed to resolve. Use of undeclared type or module core::fmt
<anon>:12 impl<T:core::fmt::Display> Node<T>
为什么我从错误中复制了完整的限定名并将其作为约束插入?
它也不适用于其他特征,例如impl<T:Num>
答案 0 :(得分:7)
这是Rust的一个丑陋的疣,我希望它能在某一天得到解决。简短版本是您想要std::fmt::Display
,而不是core::fmt::Display
:
impl<T> Node<T>
where
T: std::fmt::Display,
{
// ...
}
更长的答案是Rust标准库分为两部分:std
和core
。 core
是a lower-level library(强调我的):
Rust Core Library是Rust标准库的无依赖基础。它是语言与其库之间的可移植粘合剂,定义了所有Rust代码的内在和原始构建块。它链接到没有上游库,没有系统库,也没有libc。
核心库是最小的:它甚至不知道堆分配,也不提供并发或I / O.这些东西需要平台集成,而且这个库与平台无关。
不建议使用核心库。 libcore的稳定功能从标准库重新导出。该图书馆的构成可能会随着时间的推移而变化;只有通过libstd公开的接口才能保持稳定。
在core
和std
中实施一次项目是愚蠢的,因此标准库重新导出来自core
下的项目。但是,core
的代码自称为core
,而不是std
,因此错误消息指的是较低级别。