我有些困难理解这段代码中生命周期的关系。基本上,我有一个Rocket API,它接收一些
(我知道这不是最佳的API设计,但这是逆向工程,所以我没有选择)
为了方便地作为请求保护,我正在实现
要执行解码,我需要:
根据我的理解:
我哪里出错了,如何正确地返回反序列化的值?
x-www-form-urlencoded
数据,只有一个键:json
。直观地说,这个键包含一个使用百分号编码的JSON值,该值是一个结构体Message<T>
。(我知道这不是最佳的API设计,但这是逆向工程,所以我没有选择)
为了方便地作为请求保护,我正在实现
FromForm
,并将其用作From<Message<T>>
。为此,我需要为任何T
实现Deserialize<'de>
的Message<T>
实现FromForm<'f>
。我将我的impl签名写成了impl<'f, 'de, T> FromForm<'f> for Message<T> where T: Deserialize<'de>
。要执行解码,我需要:
- 获取表单数据中的
"json"
键; - 对值进行URL解码;
- 解析值中包含的JSON。
fn from_form(items: &mut FormItems<'f>, strict: bool) -> Result<Self, Self::Error> {
// Get JSON field
let encoded: Option<&RawStr> = items.find(|&(k, _)| k.as_str() == "json")
.map(|(_, v)| v);
if let None = encoded {
return Err(MessageFormError::MissingJsonKey);
}
// Decode URL-string
let decoded: Result<String, Utf8Error> = encoded.unwrap().url_decode();
if let Err(e) = decoded {
return Err(MessageFormError::InvalidUrl(e));
}
// Parse JSON
let json: String = decoded.unwrap();
serde_json::from_str::<Self>(&json) // Line 205
.map_err(|e| MessageFormError::InvalidJson(e))
}
这个Gist演示了问题,可以直接复制运行(在Playground上无法运行,因为它依赖于Rocket)。根据我的理解:
encoded
的&RawStr
的寿命为'f
。url_decode
通过它创建了一个String
,该String
的寿命一直持续到函数结束。serde_json
需要一个&'x str
参数,其中的'x
与'de
不必重合,并返回一个值(因此它的寿命延续到函数的结束,并且由于被返回,所以会被移动出去)。
205 | serde_json::from_str::<Self>(&json)
| ^^^^ does not live long enough
206 | .map_err(|e| MessageFormError::InvalidJson(e))
207 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the lifetime 'f as defined on the impl at 184:1...
--> src/transport.rs:184:1
|
184 | / impl<'f, T> FromForm<'f> for Message<T>
185 | | where T: Deserialize<'f>
186 | | {
187 | | type Error = MessageFormError;
... |
207 | | }
208 | | }
| |_^
我哪里出错了,如何正确地返回反序列化的值?
'f
和'de
之间似乎缺少关联。 - E net4