我有一个我希望能够从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)]
为什么这样以及如何解决?
答案 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>,
}