我试图派生serde::Deserialize一个包含对的引用的结构Path。这产生了一条错误消息,如果您将其替换&'a Path为,则不会发生&'a str。是什么引起了不同的行为#[derive(Deserialize)]?
#!/bin/cargo script
//! ```cargo
//! [dependencies]
//! serde_derive="1.0"
//! serde="1.0"
//! ```
extern crate serde_derive;
use serde_derive::*;
#[derive(Deserialize)]
struct A<'a> {
a: &'a std::path::Path,
//a: &'a str,
}
fn main() {}
Run Code Online (Sandbox Code Playgroud)
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'de` due to conflicting requirements
--> src/main.rs:7:5
|
7 | a: &'a std::path::Path,
| ^
|
note: first, the lifetime cannot outlive the lifetime 'de as defined on the impl at 5:10...
--> src/main.rs:5:10
|
5 | #[derive(Deserialize)]
| ^^^^^^^^^^^
= note: ...so that the types are compatible:
expected _IMPL_DESERIALIZE_FOR_A::_serde::de::SeqAccess<'_>
found _IMPL_DESERIALIZE_FOR_A::_serde::de::SeqAccess<'de>
note: but, the lifetime must be valid for the lifetime 'a as defined on the impl at 6:10...
--> src/main.rs:6:10
|
6 | struct A<'a> {
| ^^
= note: ...so that the types are compatible:
expected _IMPL_DESERIALIZE_FOR_A::_serde::Deserialize<'_>
found _IMPL_DESERIALIZE_FOR_A::_serde::Deserialize<'_>
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'de` due to conflicting requirements
--> src/main.rs:7:5
|
7 | a: &'a std::path::Path,
| ^
|
note: first, the lifetime cannot outlive the lifetime 'de as defined on the impl at 5:10...
--> src/main.rs:5:10
|
5 | #[derive(Deserialize)]
| ^^^^^^^^^^^
= note: ...so that the types are compatible:
expected _IMPL_DESERIALIZE_FOR_A::_serde::de::MapAccess<'_>
found _IMPL_DESERIALIZE_FOR_A::_serde::de::MapAccess<'de>
note: but, the lifetime must be valid for the lifetime 'a as defined on the impl at 6:10...
--> src/main.rs:6:10
|
6 | struct A<'a> {
| ^^
= note: ...so that the types are compatible:
expected _IMPL_DESERIALIZE_FOR_A::_serde::Deserialize<'_>
found _IMPL_DESERIALIZE_FOR_A::_serde::Deserialize<'_>
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果struct同时包含两个字段_a: &'a Path和_b: &'a str... ,则代码会编译。在这一点上,我认为这是一个bug。
向该字段添加属性:#[serde(borrow)]。这表示要暗示它应该借入该值。您必须为&str和以外的所有借项提供此属性&[u8]。
资料来源:https : //serde.rs/lifetimes.html#borrowing-data-in-a-derived-impl