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>
使用 MemReader,这样我就可以连接 io::Reader。但是编译器提示error:
rdoes not live long
.如何做对。
更新:我把代码上传到github .
最佳答案
第一个
'a
意味着Reader
对象本身有生命周期'a
.第二个'a
意味着Reader
对象不包含比'a
还长的引用.自Reader
是一个特征,它可以通过具有生命周期参数的结构来实现。此界限适用于那些潜在的生命周期参数。问题出在
T
上的绑定(bind):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) }
关于rust - 在终身问题上需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26082229/