gpt4 book ai didi

generics - Rust:缩短泛型类型界限

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

有没有办法缩短 Rust 中的泛型类型边界?
这是我必须放置很多结构体实现等的困惑:

pub struct IncomingClientMessageWithAddress<State, Msg>
where State: AppState + Clone + serde::Serialize + serde::de::DeserializeOwned + std::marker::Unpin + 'static,
Msg: AppEvent + Clone + serde::Serialize + serde::de::DeserializeOwned + std::marker::Unpin + 'static {
...

我基本上希望做这样的事情(我知道以下不适用于特征):

type MyStateAlias = AppState + Clone + serde::Serialize + serde::de::DeserializeOwned + std::marker::Unpin + 'static;
type MyEventAlias = AppEvent + Clone + serde::Serialize + serde::de::DeserializeOwned + std::marker::Unpin + 'static;


pub struct IncomingClientMessageWithAddress<State, Msg>
where State: MyStateAlias,
Msg: MyEventAlias {
...

最佳答案

我有时意识到某个特征的所有出现都与其他特征相关。在您的情况下,如果 AppState 总是与 CloneSerialize 一起出现,则您可能已经在状态之上需要这些:

trait AppState : Clone + Serialize {/*...*/}

如果没有,你仍然可以定义一个辅助特征
trait AuxAppState: AppState + Clone + Serialize {/*...*/}

并需要 State : AuxAppState

然后,要自动派生 AuxAppState ,您必须为每种类型 impl 它也 implStateCloneSerialize :
impl<T> AuxAppState for T where T: AppState + Clone + Serialize {}

最后,定义和 impl 补充 AuxAppState 可能由 macro to save some keystrokes 完成:
macro_rules! auxiliary_trait{
($traitname: ident, $($t:tt)*) => {
trait $traitname : $($t)* {}
impl<T> $traitname for T where T: $($t)* {}
}
}

所有这一切都可能有一天用 trait aliases 完成。

此外,我开始只在真正需要的地方才需要 trait bound。例如。在许多情况下, struct 定义本身不依赖于特征边界,只依赖于 impl ,所以我开始在 struct 上省略它们,只将它们保留在 impl 中。

关于generics - Rust:缩短泛型类型界限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61522814/

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