如何修复未使用的生命周期?
How to fix unused lifetime?
在尝试在 Rocket 中创建一个简单的网络服务器时,我 运行 遇到了我想重定向 或 发送 html 数据的问题,具体取决于某些条件如下:
#[post("/test/<some_string>")]
// This doesn't work Redirect and Html are different types.
pub fn test(some_string: String) -> _ {
if validate(some_string) {
Redirect("/dashboard")
} else {
content::Html("<h1>Hello World</h1>")
}
}
这显然行不通,因为 Html
和 Redirect
显然是不同的类型。然后我尝试创建一个具有不同响应器类型的枚举,以便我可以在同一函数中使用不同的响应器类型,这导致了以下代码:
pub enum TwoResponders<'r, T: Responder<'r>, V: Responder<'r>> {
ResponderOne(T),
ResponderTwo(V),
}
impl<'r, T: Responder<'r>, V: Responder<'r>> Responder<'r> for TwoResponders<'r, T, V> {
fn respond_to(self, request: &Request) -> response::Result<'r> {
match self {
TwoResponders::ResponderOne(responder) => responder.respond_to(request),
TwoResponders::ResponderTwo(responder) => responder.respond_to(request),
}
}
}
然而,这也不起作用,因为现在 Rust 编译器抱怨生命周期 'r
在结构 TwoResponders
中未被使用。我认为情况并非如此,因为它用于定义 T 和 V 需要具有的特征,但是 Rust 编译器的想法不同,并且一如既往地拥有最终决定权。
我正在考虑添加一个 PhantomData
但是这似乎是一个非常丑陋的解决方案,对于我所知不应该这么困难的事情。
有没有更好的方法来解决这个问题?
在这种情况下,泛型类型边界需要一些其他未使用的类型参数或生命周期并且添加 PhantomData
会使事情变得不必要的丑陋,我发现最干净的方法是从类型本身完全删除类型边界,并且只将它们保留在 impl
块中:
pub enum TwoResponders<T, V> {
ResponderOne(T),
ResponderTwo(V),
}
impl<'r, T: Responder<'r>, V: Responder<'r>> Responder<'r> for TwoResponders<T, V> {
fn respond_to(self, request: &Request) -> response::Result<'r> {
match self {
TwoResponders::ResponderOne(responder) => responder.respond_to(request),
TwoResponders::ResponderTwo(responder) => responder.respond_to(request),
}
}
}
在尝试在 Rocket 中创建一个简单的网络服务器时,我 运行 遇到了我想重定向 或 发送 html 数据的问题,具体取决于某些条件如下:
#[post("/test/<some_string>")]
// This doesn't work Redirect and Html are different types.
pub fn test(some_string: String) -> _ {
if validate(some_string) {
Redirect("/dashboard")
} else {
content::Html("<h1>Hello World</h1>")
}
}
这显然行不通,因为 Html
和 Redirect
显然是不同的类型。然后我尝试创建一个具有不同响应器类型的枚举,以便我可以在同一函数中使用不同的响应器类型,这导致了以下代码:
pub enum TwoResponders<'r, T: Responder<'r>, V: Responder<'r>> {
ResponderOne(T),
ResponderTwo(V),
}
impl<'r, T: Responder<'r>, V: Responder<'r>> Responder<'r> for TwoResponders<'r, T, V> {
fn respond_to(self, request: &Request) -> response::Result<'r> {
match self {
TwoResponders::ResponderOne(responder) => responder.respond_to(request),
TwoResponders::ResponderTwo(responder) => responder.respond_to(request),
}
}
}
然而,这也不起作用,因为现在 Rust 编译器抱怨生命周期 'r
在结构 TwoResponders
中未被使用。我认为情况并非如此,因为它用于定义 T 和 V 需要具有的特征,但是 Rust 编译器的想法不同,并且一如既往地拥有最终决定权。
我正在考虑添加一个 PhantomData
但是这似乎是一个非常丑陋的解决方案,对于我所知不应该这么困难的事情。
有没有更好的方法来解决这个问题?
在这种情况下,泛型类型边界需要一些其他未使用的类型参数或生命周期并且添加 PhantomData
会使事情变得不必要的丑陋,我发现最干净的方法是从类型本身完全删除类型边界,并且只将它们保留在 impl
块中:
pub enum TwoResponders<T, V> {
ResponderOne(T),
ResponderTwo(V),
}
impl<'r, T: Responder<'r>, V: Responder<'r>> Responder<'r> for TwoResponders<T, V> {
fn respond_to(self, request: &Request) -> response::Result<'r> {
match self {
TwoResponders::ResponderOne(responder) => responder.respond_to(request),
TwoResponders::ResponderTwo(responder) => responder.respond_to(request),
}
}
}