我对某些代码有点困惑,http://is.gd/OMvnN7:每晚的错误修复使其无效(有充分的理由:https://github.com/rust-lang/rust/pull/24461) ,但我没有看到任何替代方法可以让我的代码运行。
关键是我的关联类型“SignedContent”大多数时候都有一个关联的生命周期,但我不想将此生命周期绑定到其父特征(对现有代码的影响可能是每个使用此特征的特征(很多) )将需要一个额外的生命周期参数,这看起来不太实用)。
我可能会结束切换到直接返回的“get_sign_content” Vec<u8>,但我真的更喜欢返回可编码的结构。
唯一缺少的是表达我的关联类型生命周期界限与其父级相同,类似的东西(无效)
impl TrustedVal for RSAPeer
{
type SignedContent = TrustedPeerToSignEnc<'Self::lifetime>;
Run Code Online (Sandbox Code Playgroud)
或者
impl<'a> TrustedVal for RSAPeer where RSAPeer : 'a
{
type SignedContent = TrustedPeerToSignEnc<'a>;
Run Code Online (Sandbox Code Playgroud)
我也考虑(这是有效的)
impl<'a> TrustedVal for &'a RSAPeer
{
type SignedContent = TrustedPeerToSignEnc<'a>;
Run Code Online (Sandbox Code Playgroud)
但与其他一些代码相比,它变得非常尴尬。关于设计这个的正确方法有什么想法吗?
解决这个问题的一种方法是使生命周期参数成为特征的参数。这很有效,特别是当特征中只有一种方法时:
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,
}
}
}
Run Code Online (Sandbox Code Playgroud)
要使用这样的特征作为界限,您可能必须使用这个漂亮的语法:
where T: for<'a> TrustedVal<'a>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
756 次 |
| 最近记录: |