serialize :: Decodable未实现类型`& str`

时间:2015-09-19 08:11:03

标签: rust

我有一个我希望能够从json解码的结构:

#[derive(RustcDecodable)]
struct MyStruct<'a> {
  aa: Option<&'a str>,
  bb: Option<u64>,
}

它没有编译:

error: the trait `rustc_serialize::serialize::Decodable` is not implemented for the type `&str` [E0277]
src/my_file.rs:31 #[derive(RustcDecodable)]

为什么这样以及如何解决?

1 个答案:

答案 0 :(得分:8)

如果查看Decodable的文档,可以看到可以解码的所有基本类型的列表。您会注意到&str不在列表中。这是您的错误的根本原因。

仔细阅读该列表表明您永远无法解码为借用类型。 如果解码到字符串切片是可能的,那么解码后的结构将永远与输入字符串的生命周期联系在一起,很可能整个解码器类都变得不可能 - 想象一下直接读取的解码器来自文件或网络流,其中整个输入数据永远不会在内存中完全读取。

要修复它,请切换结构以拥有数据:

#[derive(RustcDecodable)]
struct MyStruct {
    aa: Option<String>,
    bb: Option<u64>,
}

或者,您可以使用Cow表示有时数据是拥有的,有时是借用的:

#[derive(RustcDecodable)]
struct MyStruct<'a> {
    aa: Option<Cow<'a, str>>,
    bb: Option<u64>,
}