在终身问题上需要帮助

时间:2014-09-28 06:19:41

标签: rust

pub struct Decoder<'a> {
    reader: &'a mut io::Reader+'a,
}

impl<'a> Decoder<'a> {
    pub fn from_reader(r: &'a mut io::Reader) -> Decoder<'a> {
        Decoder {
            reader: r,
        }
    }
}

// shortcut method to accept bytes to decode
pub fn decode<'a, T: Decodable<Decoder<'a>, IoError>>(data: Vec<u8>) -> DecodeResult<T> {
    let mut r = MemReader::new(data);
    let mut decoder = Decoder::from_reader(&mut r); // error: `r` does not live long enough
    Decodable::decode(&mut decoder)
}

我在这里有两个问题。

  1. 您如何阅读此声明(含义)reader: &'a mut io::Reader+'a。其中我引用了std json encoder
  2. 中的代码
  3. 我编写了一个快捷方法,用MemReader包装Vec<u8>,这样我就可以连接io :: Reader。但编译器抱怨error: r does not live long。如何做对。
  4. 更新:我将代码上传到github

1 个答案:

答案 0 :(得分:1)

  1. 第一个'a表示Reader对象本身具有生命周期'a。第二个'a表示Reader对象没有包含超过'a的引用。由于Reader是一个特征,它可以由具有生命周期参数的结构实现。此约束适用于那些潜在的寿命参数。

  2. 问题在于TDecodable<Decoder<'a>, IoError>的约束引用了生命周期参数'a。但是,您创建的Decoder引用了一个局部变量,而'a指的是一个比函数调用更长的生命周期(因为它是一个隐式指定的输入参数)呼叫网站)。

    我认为目前还没有办法在没有不安全代码的情况下成功编译此函数。事实上,Encoder::buffer_encode似乎有同样的问题(#14302),并使用类似的解决方法。 transmute允许我们将当地生命期限强制为'a

    pub fn decode<'a, T: Decodable<Decoder<'a>, IoError>>(data: Vec<u8>) -> DecodeResult<T> {
        let mut r = MemReader::new(data);
        let mut decoder = unsafe { mem::transmute(Decoder::from_reader(&mut r)) };
        Decodable::decode(&mut decoder)
    }