2015-10-17 2 views
2

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

[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 в только для чтения или чтения-записи режима.

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

ответ

5

Handler черта является subtrait из 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; 
} 

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

Смежные вопросы