问题描述
在尝试在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>")
}
}
这显然不起作用,因为Html
和Redirect
显然是不同的类型。然后,我尝试创建具有不同响应者类型的枚举,以便可以在同一函数中使用不同的响应者类型,这导致以下代码:
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