好吧,我是一个 Rust 新手,我正在尝试 Rocket。该 Web 框架通过 Form<MyStruct>
,我想将该 MyStruct 传输到我自己的自定义结构中。
struct Consumer<T> {
d: T,
}
impl<T> Consumer<T> {
fn new(form: Form<T>) -> Self {
Consumer { d: form.into_inner() }
}
}
这当然行不通,我明白:
the trait `rocket::request::FromForm<'_>` is not implemented for `T`
下一次尝试:
impl<T> Consumer<T> where T: FromForm {
fn new(form: Form<T>) -> Self {
Consumer { d: form.into_inner }
}
}
呃哦:
impl<T> Consumer<T> where T: FromForm {
^^^^^^^^ expected lifetime parameter
所以现在我发现自己完全无法解决这个问题!我能想到的最好的办法是:
impl<'f, T> Consumer<T> where T: FromForm<'f> {
fn new(form: Form<T>) -> Self {
Consumer { d: form.into_inner }
}
}
但这会导致此错误:
51 | fn new(form: Form<T>) -> Self {
| _________^
52 | | Consumer { d: form.into_inner }
53 | | }
| |_________^ lifetime mismatch
= note: expected type `rocket::request::FromForm<'_>`
found type `rocket::request::FromForm<'f>`
最佳答案
Form
还有一个生命周期参数。如果将其与 FromForm
的生命周期联系起来,那么您将向前推进一点:
impl<'f, T> Consumer<T> where T: FromForm<'f> {
fn new(form: Form<'f, T>) -> Self {
Consumer(form.into_inner())
}
fn get(&self) -> &T {
&self.0
}
}
作为一般规则,如果您返回一个依赖于另一个对象中的数据的对象,那么您需要像这样将它们的生命周期链接在一起。
此时,您将看到另一个错误,它可以方便地为您提供修复该错误所需的所有信息:
error[E0310]: the parameter type `T` may not live long enough
--> src/main.rs:50:17
|
48 | impl<'f, T> Consumer<T> where T: FromForm<'f> {
| - help: consider adding an explicit lifetime bound `T: 'static`...
49 | fn new(form: Form<'f, T>) -> Self {
50 | Consumer(form.into_inner())
| ^^^^^^^^^^
|
note: ...so that the type `T` will meet its required lifetime bounds
--> src/main.rs:50:17
|
50 | Consumer(form.into_inner())
| ^^^^^^^^^^
into_inner
method on Form
要求其类型参数 T
具有 'static
生命周期,并且错误消息建议添加此约束。
通过这些更改,它将编译:
impl<'f, T: 'static> Consumer<T> where T: FromForm<'f> {
fn new(form: Form<'f, T>) -> Self {
Consumer(form.into_inner())
}
fn get(&self) -> &T {
&self.0
}
}
关于rust - 当 Rust 结构包含生命周期特征时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52427732/