作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我知道我可以使用 Box
如果我想定义一个递归结构。例如,
struct LinkNode {
next: Option<Box<LinkNode>>
}
impl LinkNode{
fn get_next(&self) -> Option<Box<LinkNode>>{
None
}
fn append_next(&mut self, next: LinkNode) -> Self{
self
}
}
但是
如何通过模板或特征对象在这些结构上创建特征 ?
fn append_next(...) -> Self
的存在,我不能像这样直接创建一个特征对象:
pub trait Linkable {
fn get_next(&self) -> Option<Box<dyn Linkable>>;
fn append_next(&mut self, next: impl Linkable) -> Self;
}
我们无法返回
Option<Box<impl Linkable>>
或
impl Linkable
为
fn get_next(&self)
.
T
的类型在构造新的
LinkNode
时递归.
pub trait Linkable<T:Linkable<T> + Clone> : Clone {
fn get_next(&self) -> Option<Box<T>>;
fn append_next(&mut self, next: T) -> Self;
}
pub trait Linkable: LinkClone{
fn get_next(&self) -> Option<Box<dyn Linkable>>;
}
pub trait LinkAppend {
fn append_next(&mut self, next: Box<dyn Linkable>) -> Box<dyn Linkable>;
}
pub trait LinkClone{
fn clone_box(&self) -> Box<dyn Linkable>;
}
impl<T> LinkClonefor T
where
T: 'static + Linkable+ LinkAppend + Clone,
{
fn clone_box(&self) -> Box<dyn Linkable> {
Box::new(self.clone())
}
}
impl Clone for Box<dyn Linkable> {
fn clone(&self) -> Box<dyn Linkable> {
self.clone_box()
}
}
顺便说一句,在上述探索过程中,我还有一些其他问题:为什么 Rust 禁止 impl Linkable
糖,如 Box<impl Linkale>
?以及为什么返回 impl Linkable
在一个特性中被禁止?
pub trait Linkable {
fn get_next<T:Linkable>(&self) -> Next<T>;
fn append_next<T:Linkable>(&mut self, next: Next<T>) -> Self;
}
struct Next<T: Linkable> {
node: T,
}
这是在另一个
question: Can I define a trait with a type parameter of itself in Rust?中提到的
最佳答案
Linkable
可能有名为 Next
的关联类型.
pub trait Linkable {
type Next: Linkable;
}
get_next
现在返回
Self::Next
类型的实例, 和
append_next
需要
Self::Next
作为参数:
pub trait Linkable {
type Next: Linkable;
fn get_next(&self) -> Option<Self::Next>;
fn append_next(&mut self, next: Self::Next) -> &Self;
}
现在您可以实现
Linkable
为
Linknode
:
impl Linkable for LinkNode {
type Next = LinkNode;
fn get_next(&self) -> Option<Box<LinkNode>> {
None
}
fn append_next(&mut self, next: LinkNode) -> &Self {
self
}
}
Why Rust forbids the impl Linkable sugar, like the Box? And why returning impl Linkable is forbidden in a trait?
impl Trait
as a function's return type in a trait definition?对于这个问题的答案。
关于rust - 如何在 Rust 中定义递归特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65845197/
我是一名优秀的程序员,十分优秀!