如何解决未使用的生命周期?

问题描述

在尝试在Rocket中创建简单的Web服务器时,我遇到了一个问题,我想根据以下特定条件重定向发送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,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,但是对于似乎并不难的事情,这似乎是一个非常丑陋的解决方案。

是否有更好的方法解决此问题?

解决方法

在这种情况下,泛型类型边界需要一些其他未使用的类型参数或生存期,并且添加ArrayOfItems会使事情变得不必要地丑陋,我发现最干净的方法是仅从类型本身中删除类型边界,并且只将它们放在PhantomData块中:

impl