gpt4 book ai didi

rust - 具有特征的通用 API

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

我正在尝试泛化/分离 API,以便可以使用满足特征的替代结构。在有关嵌套特征的语法上苦苦挣扎。这是我正在尝试做的精简示例。请注意,在真实的情况下,有多个子特征,这可能会引发后续问题“如果我在正确的轨道上,如何减少冗长”。

pub mod general {
/// A trait to make the API generic
pub trait MyTrait<A: PartialEq> {
// type A: Partial
fn val(self) -> A;
}

/// Part of the generic API
pub struct Data<A: PartialEq, T: MyTrait<A>> {
mys: T
}

/// Another part of the generic API
fn doit<A: PartialEq>(s: impl MyTrait<A>) -> impl MyTrait {
s
}
}

pub mod specific {
/// Api-specific substruct
#[derive(PartialEq)]
pub struct Aval {
val: u32
}

/// My top-level custom struct
pub struct MyS {
val: Aval
}
}

impl<A: PartialEq> crate::general::MyTrait<A> for crate::specific::MyS {
fn val(self) -> crate::specific::Aval {
self.val
}
}

/// Example of how we'd use this
fn main() {
let mys = crate::specific::MyS{ val: crate::specific::Aval{ val: 0 } };
let S = crate::general::Data{mys};
crate::general::doit(mys); // Eg pretend we cloned or didn't create S.
}

Playground

在这个具体的例子中,我们有一个鸡+蛋:error[E0392] 的数据结构出错:从未使用过参数 `A`。如果我们删除 A:error[E0412]: cannot find type `A` in this scope

我怀疑这是与关联类型相关的语法问题。

最佳答案

只需从您的 struct 中删除特征绑定(bind).

struct Data<T> {
mys: T
}

您仍然可以为 Data<T> 添加方法和特征实现在 T 上需要更具体的界限, 但你不需要它们来定义 Data<T> 的布局, 所以你不应该在那里指定它们(在这种情况下,你不能,除非你添加一个引用 PhantomDataA 成员)。

您的代码还有许多其他错误,但我相信您会解决的。如果您再次遇到困难,请随时发表评论。

关于rust - 具有特征的通用 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54165876/

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