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, 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
が struct で使用されていないと不平を言うため、これも機能しませんでしたTwoResponders
。T と V が持つ必要がある特性を定義する際に使用されるため、これは当てはまらないと思いますが、Rust コンパイラは別の方法で考え、いつものように最終的な単語を持っています。
PhantomData
しかし、私の知る限りではそれほど難しくないはずの、信じられないほど醜い解決策のように思われるものを追加することを考えていました。
これを修正するより良い方法はありますか?