rust - 在终身问题上需要帮助

标签 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. 我写了一个快捷方式来包装Vec<u8>使用 MemReader,这样我就可以连接 io::Reader。但是编译器提示 error: r does not live long .如何做对。

更新:我把代码上传到github .

最佳答案

  1. 第一个'a意味着 Reader对象本身有生命周期 'a .第二个'a意味着 Reader对象不包含'a 还长的引用.自 Reader是一个特征,它可以通过具有生命周期参数的结构来实现。此界限适用于那些潜在的生命周期参数。

  2. 问题出在 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/

相关文章:

struct - Rust 中结构的字段可变性

json - 在同一属性中解析具有多种表示形式的 JSON

list - 向前和向后迭代

unit-testing - 应该如何组织 Rust 单元测试?

random - 来自掩码的均匀随机位

rust - 将本地字符串作为切片返回 (&str)

rust - 有没有办法在文档注释中内联常量(由 cargo 文档呈现)?

error-handling - 如何使用Serde解析可能在不失败整个反序列化的情况下无法反序列化的字段?

optimization - 我可以在 Rust 中按值有效地返回对象吗?

Rust 读取 csv 时输入错误