2017-04-12 4 views
1

Ich renne in einen Kompilierungsfehler, den ich mit einer geringfügigen Abwandlung der Beispiele von der master Niederlassung von Hyper nicht ganz verstehe. Angesichts der folgenden Code:Compilierungsfehler mit Hyper

extern crate futures; 
extern crate hyper; 

use futures::future::FutureResult; 
use hyper::header::{ContentLength, ContentType}; 
use hyper::server::{Http, Service, Request, Response, Server, NewService}; 
use hyper::Body; 
use std::fmt::Display; 
use std::result; 

static PHRASE: &'static [u8] = b"Hello World!"; 

#[derive(Clone, Copy)] 
pub struct MyService {} 

impl Service for MyService { 
    type Request = Request; 
    type Response = Response; 
    type Error = hyper::Error; 
    type Future = FutureResult<Response, hyper::Error>; 
    fn call(&self, _req: Request) -> Self::Future { 
     return futures::future::ok(Response::new() 
      .with_header(ContentLength(PHRASE.len() as u64)) 
      .with_header(ContentType::plaintext()) 
      .with_body(PHRASE)); 
    } 
} 

#[derive(Clone)] 
pub struct MyServer {} 

#[derive(Debug)] 
pub struct MyServeError(String); 
impl<T: Display> From<T> for MyServeError { 
    fn from(e: T) -> MyServeError { 
     return MyServeError(format!("{}", e)); 
    } 
} 

type Result<T> = result::Result<T, MyServeError>; 


impl MyServer { 
    pub fn new() -> MyServer { 
     return MyServer {}; 
    } 

    fn get_server(&self) -> Result<Server<&MyServer, Body>> { 
     let addr = format!("127.0.0.1:8080").parse()?; 
     return Ok(Http::new().bind(&addr, self)?); 
    } 
} 

impl NewService for MyServer { 
    type Request = Request; 
    type Response = Response; 
    type Instance = MyService; 
    type Error = hyper::Error; 

    fn new_service(&self) -> std::io::Result<Self::Instance> { 
     let service = MyService {}; 
     Ok(service) 
    } 
} 

Ich erhalte diese Kompilierungsfehler:

Compiling hyper-problem-demo v0.1.0 (file:///.../hyper-problem-demo) 
error[E0277]: the trait bound `MyServer: std::ops::Fn<()>` is not satisfied 
    --> src/lib.rs:50:31 
    | 
50 |   return Ok(Http::new().bind(&addr, self)?); 
    |        ^^^^ the trait `std::ops::Fn<()>` is not implemented for `MyServer` 
    | 
    = note: required because of the requirements on the impl of `std::ops::FnOnce<()>` for `&MyServer` 
    = note: required because of the requirements on the impl of `hyper::server::NewService` for `&MyServer` 

error[E0277]: the trait bound `MyServer: std::ops::FnOnce<()>` is not satisfied 
    --> src/lib.rs:50:31 
    | 
50 |   return Ok(Http::new().bind(&addr, self)?); 
    |        ^^^^ the trait `std::ops::FnOnce<()>` is not implemented for `MyServer` 
    | 
    = note: required because of the requirements on the impl of `hyper::server::NewService` for `&MyServer` 

Was ich nicht wirklich verstehen. Meine Absicht war nur das MyServer Objekt zu verwenden, um neue Instanzen von MyService für Hyper zu erstellen, so scheint es sinnvoll zu implementieren NewService, aber ich verstehe nicht, warum das eine Implementierung von Fn() erfordern würde. NewService ist eigentlich für Fn() -> io::Result<Service implementiert, also vielleicht das ist irgendwie kollidieren?

Es gibt ein vollständiges Beispielprojekt here.

+0

im Wesentlichen die gleiche wie http://stackoverflow.com/q/40922505/ 155423 – Shepmaster

Antwort

1

Sie haben NewService für MyServer implementiert aber Sie bind ein &MyServer bieten, die es nicht eine Implementierung von NewService finden können.

Die Lösung, die Sie gehen, hängt in hohem Maße von, warum Sie dies tun wollen, aber man konnte NewService für &MyServer implementieren:

impl<'a> NewService for &'a MyServer { 
    ... 
}