2016-12-01 4 views
2

Я пытаюсь создать обработчик для Железных запросов:Невозможно создать обработчик Железного, потому что черта связана СТД :: опс :: Fn <(& мут железа :: Request)> не выполняется

extern crate iron; 
extern crate mount; 

use iron::{Iron, Request, Response, IronResult, status}; 
use mount::Mount; 
use iron::middleware::Handler; 

struct Server { 
    message: String 
} 

impl Server { 
    pub fn start(&self){ 
     let mut mount = Mount::new(); 
     mount.mount("/", &self); 
     Iron::new(mount).http("0.0.0.0:3000").unwrap(); 
    } 
} 

impl Handler for Server { 
    fn handle(&self, _req: &mut Request) -> IronResult<Response>{ 
     Ok(Response::with((status::Ok, self.message))) 
    } 
} 

fn main() { 
    Server{message: "test".to_string()}.start(); 
} 

но ответ компилятора:

error[E0277]: the trait bound `for<'r, 'r, 'r> Server: std::ops::Fn<(&'r mut iron::Request<'r, 'r>,)>` is not satisfied 
    --> src/main.rs:15:15 
    | 
15 |   mount.mount("/", &self); 
    |    ^^^^^ trait `for<'r, 'r, 'r> Server: std::ops::Fn<(&'r mut iron::Request<'r, 'r>,)>` not satisfied 
    | 
    = note: required because of the requirements on the impl of `std::ops::FnOnce<(&mut iron::Request<'_, '_>,)>` for `&Server` 
    = note: required because of the requirements on the impl of `iron::Handler` for `&&Server` 

Я не мог понять, что говорит мне Ржавчина.

+0

http://stackoverflow.com/q/34489422 имеет ту же ошибку – Shepmaster

+0

Как http://stackoverflow.com/q/38659008 – Shepmaster

+0

Необходимо обновить до новейшей версии Rust, которая улучшила сообщения об ошибках и ошибки форматирование сообщений. Я обновил ваше сообщение об ошибке до более нового формата, потому что нам легче читать здесь. – Shepmaster

ответ

2

Репродукция вашей проблемы; можете ли вы определить проблему?

trait Foo {} 

struct Bar; 

impl Foo for Bar {} 

impl Bar { 
    fn thing(&self) { 
     requires_bar(self); 
    } 
} 

fn requires_bar<F>(foo: F) where F: Foo {} 

fn main() {} 

Отказ?

Вы реализовали черта для структуры:

impl Handler for Server 

Но затем пытаются использовать ссылку на ссылку на ваш структуры, что делает не реализации признака:

pub fn start(&self) { 
    // ... 
    mount.mount("/", &self); 
    // ... 
} 

Так что это не может работать. Вам нужно перестроить свой код или реализовать признак для ссылки на вашу структуру.

+0

Спасибо @Shepmaster – TlmaK0

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