gpt4 book ai didi

rust - nightly 的无限制生命周期,需要设计建议

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

我有点卡在一些代码上了,http://is.gd/OMvnN7 : nightly 上的错误修复使其无效(有充分的理由:https://github.com/rust-lang/rust/pull/24461),但我没有看到让我的代码运行的任何替代方法。

重点是我的关联类型“SignedContent”大多数时候都有一个关联的生命周期,但我不想将这个生命周期绑定(bind)到它的父特征(对现有代码的影响可能是每个特征都使用这个特征(很多)将需要一个额外的生命周期参数,这看起来不太实用)。

我可能会结束切换到返回 Vec<u8> 的“get_sign_content”直接,但我真的更喜欢返回一个可编码的结构。

唯一缺少的是说我的关联类型生命周期绑定(bind)与其父级相同的表达能力,类似的东西(无效)

impl TrustedVal for RSAPeer
{
type SignedContent = TrustedPeerToSignEnc<'Self::lifetime>;

或者

impl<'a> TrustedVal for RSAPeer where RSAPeer : 'a
{
type SignedContent = TrustedPeerToSignEnc<'a>;

我也考虑(这个有效)

impl<'a> TrustedVal for &'a RSAPeer
{
type SignedContent = TrustedPeerToSignEnc<'a>;

但它与其他一些代码变得非常尴尬。关于正确设计此方法的任何想法?

最佳答案

修复它的一种方法是使生命周期参数成为特征的参数。这很有效,尤其是当你在特征中只有一个方法时:

pub trait TrustedVal<'a> {
type SignedContent : Encodable ;
fn get_sign_content(&'a self) -> Self::SignedContent;
}

impl<'a> TrustedVal<'a> for RSAPeer
{
type SignedContent = TrustedPeerToSignEnc<'a>;

fn get_sign_content(&'a self) -> TrustedPeerToSignEnc<'a> {
TrustedPeerToSignEnc {
version : 0,
name : &self.name,
}
}
}

要使用这样的特征作为边界,您可能必须使用这种漂亮的语法:

where T: for<'a> TrustedVal<'a>

关于rust - nightly 的无限制生命周期,需要设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29745134/

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