gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:41:43 26 4
gpt4 key购买 nike

尝试在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, 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,但是对于某些我认为并不难的东西来说,这似乎是一个极其丑陋的解决方案。
有更好的方法来解决此问题吗?

最佳答案

在这种情况下,泛型类型边界需要一些其他未使用的类型参数或生存期,并且添加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),
}
}
}

关于rust - 如何修复未使用的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63367420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com