Iron Handler: отсутствуют спецификаторы срока службы

Я пытаюсь реализовать обработчик Iron, содержащий ссылку на другую структуру. Эта структура содержит данные и выполняет все операции с данными.

[package]
name = "testcrate"
version = "0.1.0"
authors = ["me"]

[dependencies]
iron = "^0.2"

Это код:

//! Handlers for the server.
extern crate iron;

use iron::{status, middleware};
use iron::IronResult;
use iron::prelude::Set;
use iron::request::Request;
use iron::response::Response;

/// The MyServer struct holds the data and provides methods
/// to manipulate or retrieve that data.
struct MyServer;
impl MyServer {
    pub fn build_response() -> String {
        "response".to_string()
    }   
}

/// The ReadHandler handles the creation of HTTP responses.
pub struct ReadHandler {
    pub server: &MyServer,
}
impl middleware::Handler for ReadHandler {                                                                                         

    /// Return the current status JSON.
    fn handle(&self, req: &mut Request) -> IronResult<Response> {
        let body = self.server.build_response();
        let response = Response::with((status::Ok, body));
        Ok(response)
    }   
}

К сожалению, я получаю ошибки об отсутствии спецификаторов времени жизни:

src/lib.rs:22:17: 22:26 error: missing lifetime specifier [E0106]
src/lib.rs:22     pub server: &MyServer,
                              ^~~~~~~~~
src/lib.rs:22:17: 22:26 help: run `rustc --explain E0106` to see a detailed explanation

Но когда я добавляю спецификаторы времени жизни (которые я еще не совсем понял)...

pub struct ReadHandler<'a> {
    pub server: &'a MyServer,
}
impl<'a> middleware::Handler for ReadHandler<'a> {
    // ...
}

... Я получаю другое сообщение об ошибке:

src/lib.rs:24:1: 32:2 error: the type `ReadHandler<'a>` does not fulfill the required lifetime
src/lib.rs:24 impl<'a> middleware::Handler for ReadHandler<'a> {
src/lib.rs:25 
src/lib.rs:26     /// Return the current status JSON.
src/lib.rs:27     fn handle(&self, req: &mut Request) -> IronResult<Response> {
src/lib.rs:28         let body = self.server.build_response();
src/lib.rs:29         let response = Response::with((status::Ok, body));
              ...
note: type must outlive the static lifetime

Будут и другие обработчики, которые будут обращаться к MyServer в режиме только для чтения или чтения-записи.

Каким будет правильный способ добавить спецификаторы времени жизни? Или мне, может быть, нужна структура, подобная дуге?


person Danilo Bargen    schedule 17.10.2015    source источник


Ответы (1)


Черта Handler является частью черты Any:

pub trait Handler: Send + Sync + Any {
    fn handle(&self, &mut Request) -> IronResult<Response>;
}

А трейт Any имеет срок жизни 'static:

pub trait Any: Reflect + 'static {
    fn get_type_id(&self) -> TypeId;
}

Привязка 'static означает, что ваша структура не может содержать ссылки. Вам придется использовать другой тип указателя. Поскольку Handler также является подчертой Send и Sync, вам нужно будет использовать Arc, поскольку Rc не является ни Send, ни Sync.

person Francis Gagné    schedule 17.10.2015