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)
}
我在这里有两个问题。
reader: &'a mut io::Reader+'a
。其中我引用了std json encoder。Vec<u8>
,这样我就可以连接io :: Reader。但编译器抱怨error:
r does not live long
。如何做对。更新:我将代码上传到github。
答案 0 :(得分:1)
第一个'a
表示Reader
对象本身具有生命周期'a
。第二个'a
表示Reader
对象没有包含超过'a
的引用。由于Reader
是一个特征,它可以由具有生命周期参数的结构实现。此约束适用于那些潜在的寿命参数。
问题在于T
:Decodable<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)
}