Что означает код ошибки Rust E0495? - PullRequest
0 голосов
/ 10 декабря 2018

Я использую Rocket для создания веб-сервера и пытаюсь создать оболочку для черты Responder, чтобы мои методы маршрутизации могли возвращать любую структуру.

Кодниже не компилируется из-за ошибки о временах жизни, которую я не полностью понимаю.Ошибка не указана в индексе ошибок ;он переходит с E0492 на E0496.

Поскольку этот код использует Rocket, он требует ночного компилятора.

main.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>

1 Ответ

0 голосов
/ 10 декабря 2018

Что означает код ошибки Rust E0495?

Код ошибки E0495 кажется универсальным для множества различных ситуаций, в которых требования к сроку службы не могут бытьпомирились.Это сообщение уже говорит об этом, и существует огромное количество способов, которыми вы могли бы написать код, в котором время жизни не совпадает должным образом, возможно, поэтому его нет в списке с примерами в индексе ошибок.


Параметры типа, включая время жизни, всегда определяются вызывающей стороной.Глядя на ваш конкретный пример, сигнатура функции, подобная этой:

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

означает, что для любого времени жизни 'a, выбранного вызывающей стороной, ссылки внутри возвращенного DynamicResponder<'a> должны бытьдействительный.Но что могут быть ссылки внутри DynamicResponder<'a> в этой ситуации?Они не могут быть ссылками на переменные в теле функции, потому что они живут только функцию.Аргументы отсутствуют, поэтому DynamicResponder<'a> может ссылаться только на то, что находится вне функции, то есть на статике.

Вы можете исправить ошибку, удалив переменную времени жизни и установив параметр времени жизник единственной жизни, которая имеет смысл:

fn route() -> DynamicResponder<'static> { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...