gpt4 book ai didi

rust - 如何在 Rust 中定义递归特征?

转载 作者:行者123 更新时间:2023-12-03 11:25:06 24 4
gpt4 key购买 nike

首先,我知道我可以使用 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 Linkablefn 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在一个特性中被禁止?

更新 在易卜拉欣的回答之后:
除了来自 Ibraheem 的关联类型实现,这样工作也很好。核心思想是避免特征中的递归类型声明。
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;
}
现在您可以实现 LinkableLinknode :
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?


您可以引用 Is it possible to use impl Trait as a function's return type in a trait definition?对于这个问题的答案。

关于rust - 如何在 Rust 中定义递归特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65845197/

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