如何修复未使用的生命周期?

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>")
    }
}

这显然行不通,因为 HtmlRedirect 显然是不同的类型。然后我尝试创建一个具有不同响应器类型的枚举,以便我可以在同一函数中使用不同的响应器类型,这导致了以下代码:

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),
        }
    }
}