gpt4 book ai didi

rust - Rust 错误代码 E0495 是什么意思?

转载 作者:行者123 更新时间:2023-11-29 08:15:43 25 4
gpt4 key购买 nike

我正在使用 Rocket制作一个网络服务器,我试图围绕 Responder 特性制作一个包装器,以便我的路由方法可以返回任何结构。

由于我不完全理解的有关生命周期的错误,下面的代码无法编译。错误是 not listed in the error index ;它从 E0492 跳到 E0496

由于此代码使用 Rocket,因此需要夜间编译器。

主要.rs

#![feature(custom_attribute, proc_macro_hygiene, decl_macro)]
#[macro_use]
extern crate rocket;
extern crate rocket_contrib;

use rocket::{http::Status, response::Responder, Request};
use rocket_contrib::templates::Template;

fn main() {
rocket::Rocket::ignite().mount("/", routes![route]).launch();
}

#[get("/")]
fn route<'a>() -> DynamicResponder<'a> {
DynamicResponder::from(Template::render("template", ()))
}

struct DynamicResponder<'a> {
inner: Box<dyn Responder<'a> + 'a>,
}

impl<'r> DynamicResponder<'r> {
pub fn from<T: 'r>(responder: T) -> DynamicResponder<'r>
where
T: Responder<'r>,
{
DynamicResponder {
inner: Box::new(responder),
}
}
}

impl<'r> Responder<'r> for DynamicResponder<'r> {
fn respond_to<'b>(
self,
request: &'b Request,
) -> Result<rocket::response::Response<'r>, Status> {
self.inner.respond_to(request)
}
}

cargo .toml

[package]
name = "rocketing_around"
version = "0.1.0"

[dependencies]
rocket = "0.4.0"

[dependencies.rocket_contrib]
version = "0.4.0"
default_features = false
features = [ "handlebars_templates" ]

编译器信息:

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'r` due to conflicting requirements
--> src/main.rs:15:5
|
15 | DynamicResponder::from(Template::render("template", ()))
| ^^^^^^^^^^^^^^^^^^^^^^
|
note: first, the lifetime cannot outlive the lifetime 'a as defined on the function body at 14:10...
--> src/main.rs:14:10
|
14 | fn route<'a>() -> DynamicResponder<'a> {
| ^^
= note: ...so that the expression is assignable:
expected DynamicResponder<'a>
found DynamicResponder<'_>
= note: but, the lifetime must be valid for the static lifetime...
= note: ...so that the types are compatible:
expected rocket::response::Responder<'_>
found rocket::response::Responder<'static>

最佳答案

What does the Rust error code E0495 mean?

错误代码E0495对于无法调和生命周期要求的各种不同情况,这似乎是一个包罗万象的方法。该消息已经说明了这一点,并且您可以通过多种方式编写生命周期不正确匹配的代码,这也许就是错误索引中未将其与示例一起列出的原因。


类型参数,包括生命周期,总是由调用者决定。查看您的特定示例,像这样的函数签名:

fn route<'a>() -> DynamicResponder<'a> { ... }

意味着,对于任何生命周期'a由调用者选择,返回的内部引用 DynamicResponder<'a>必须有效。但是DynamicResponder<'a>里面的引用又是什么呢?甚至会落到这种地步?它们不能是函数体中变量的引用,因为它们只在函数中存在。没有参数,所以唯一可以被 DynamicResponder<'a> 引用的东西是函数之外的东西,即静态。

您可以通过删除生命周期变量并将生命周期参数设置为唯一有意义的生命周期来修复错误:

fn route() -> DynamicResponder<'static> { ... }

关于rust - Rust 错误代码 E0495 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53703181/

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