2015-12-28 4 views
0

Я пытаюсь реализовать признак BeforeMiddleware для struct У меня есть. Я написал следующий код:Для реализации BeforeMiddleware требуется реализация core :: ops :: Fn

impl BeforeMiddleware for Auth { 
    fn before(&self, _: &mut Request) -> IronResult<()> { 
     println!("before called"); 
     Ok(()) 
    } 

    fn catch(&self, _: &mut Request, err: IronError) -> IronResult<()> { 
     println!("catch called"); 
     Err(err) 
    } 
} 

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

> cargo build 
... 
src/handlers/mod.rs:38:11: 38:28 error: the trait `for<'r, 'r, 'r> core::ops::Fn<(&'r mut iron::request::Request<'r, 'r>,)>` is not implemented for the type `auth::Auth` [E0277] 
src/handlers/mod.rs:38  chain.link_before(auth); 
           ^~~~~~~~~~~~~~~~~ 
src/handlers/mod.rs:38:11: 38:28 help: run `rustc --explain E0277` to see a detailed explanation 
src/handlers/mod.rs:38:11: 38:28 error: the trait `for<'r, 'r, 'r> core::ops::FnOnce<(&'r mut iron::request::Request<'r, 'r>,)>` is not implemented for the type `auth::Auth` [E0277] 
src/handlers/mod.rs:38  chain.link_before(auth); 
           ^~~~~~~~~~~~~~~~~ 
src/handlers/mod.rs:38:11: 38:28 help: run `rustc --explain E0277` to see a detailed explanation 
error: aborting due to 2 previous errors 
... 

Но the documentation говорит функция link_before требует только BeforeMiddleware.

Кто-нибудь знает, почему я вижу эту ошибку и как ее исправить?

EDIT:

Я фактически использовал статический auth, после того, как делает его нестатическим проблема ушла.

ответ

4

Это работает просто отлично:

extern crate iron; 

use iron::{Chain, BeforeMiddleware, IronResult, Request, Response, IronError}; 
use iron::status; 

struct Auth; 

impl BeforeMiddleware for Auth { 
    fn before(&self, _: &mut Request) -> IronResult<()> { 
     println!("before called"); 
     Ok(()) 
    } 

    fn catch(&self, _: &mut Request, err: IronError) -> IronResult<()> { 
     println!("catch called"); 
     Err(err) 
    } 
} 

fn main() { 
    fn hello_world(_: &mut Request) -> IronResult<Response> { 
     Ok(Response::with((status::Ok, "Hello World!"))) 
    } 

    let mut c = Chain::new(hello_world); 
    let auth = Auth; 
    c.link_before(auth); 
} 

компилируется против железа 0.2.6.

+0

Код, который я поставил в вопросе, не совсем то, что я использовал, единственное отличие заключалось в том, что 'auth' был статическим. Сделав его нестационарным, он просто сработал. Благодарю. – russoue