我对某些代码感到有些困惑,http://is.gd/OMvnN7:每晚修复一次错误使其无效(有充分理由:https://github.com/rust-lang/rust/pull/24461),但我没有看到任何替代品我的代码运行。
重点是我的关联类型' SignedContent'大部分时间都有相关的生命周期,但我不想将这个生命周期绑定到它的父特征(对现有代码的影响很可能是使用这个特征(很多)的每个特征都需要额外的生命周期参数看起来不太实际。)
我可能会结束切换到&#39; get_sign_content&#39;直接返回Vec<u8>
,但我真的更喜欢返回一个可编码的结构。
唯一缺少的是表达我的关联类型生命周期绑定与其父级相同的表达性,类似的东西(无效)
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>;
但是其他一些代码变得非常尴尬。有关正确设计方法的想法吗?
答案 0 :(得分:2)
解决此问题的一种方法是将life参数作为特征的参数。这种方法效果很好,尤其是当您在特征中只有一个方法时:
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>