2016-07-24 13 views
-1
kodieren

Ich folge einem Iron Web Framework Tutorial, das ziemlich einfach schien, aber ich kann nicht scheinen, eine Struktur als JSON zu kodieren.Kann nicht Struktur in JSON in Rust

extern crate iron; 
extern crate rustc_serialize; 

use iron::prelude::*; 
use iron::status; 
use rustc_serialize::json; 

struct Greeting { 
    msg: String, 
} 

fn main() { 
    fn hello_world(_: &mut Request) -> IronResult<Response> { 
     let greeting = Greeting { msg: "hello_world".to_string() }; 
     let payload = json::encode(&greeting).unwrap(); 
     // Ok(Response::with((status::Ok,payload))) 
    } 

    // Iron::new(hello_world).http("localhost:3000").unwrap(); 
} 

Mein Cargo.toml

[package] 
name = "iron_init" 
version = "0.1.0" 
authors = ["mazbaig"] 

[dependencies] 
iron = "*" 
rustc-serialize = "*" 

Und mein Fehler:

error: the trait bound `Greeting: rustc_serialize::Encodable` is not satisfied [E0277] 
     let payload = json::encode(&greeting).unwrap(); 
         ^~~~~~~~~~~~ 
help: run `rustc --explain E0277` to see a detailed explanation 
note: required by `rustc_serialize::json::encode` 

ich irgendwie bekommen, dass die richtigen Typen sind nicht in die json.encode() Funktion übergeben zu werden, aber ich bin Schwierigkeiten haben, herauszufinden, was es von mir will. Vermutlich vermisse ich etwas wirklich Grundlegendes.

+2

Welches Tutorial? Sie müssen hinzufügen '# [ableiten (RustcEncodable)]' auf 'Gruß' – kennytm

Antwort

4

Sie haben das eigentliche von Ihnen verwendete Lernprogramm nicht angegeben, es entspricht jedoch this one from brson.

extern crate iron; 
extern crate rustc_serialize; 

use iron::prelude::*; 
use iron::status; 
use rustc_serialize::json; 

#[derive(RustcEncodable)] 
struct Greeting { 
    msg: String 
} 

fn main() { 
    fn hello_world(_: &mut Request) -> IronResult<Response> { 
     let greeting = Greeting { msg: "Hello, World".to_string() }; 
     let payload = json::encode(&greeting).unwrap(); 
     Ok(Response::with((status::Ok, payload))) 
    } 

    Iron::new(hello_world).http("localhost:3000").unwrap(); 
    println!("On 3000"); 
} 

Beachten Sie etwas anderes zwischen den beiden?

#[derive(RustcEncodable)] 
struct Greeting { 
    msg: String 
} 

Sie müssen angeben, dass die Encodable Merkmal implementiert wird. In diesem Fall können Sie dies tun, indem Sie RustcEncodable ableiten.

+0

Oh okay. Gibt es einen Grund, warum Strukturen standardmäßig nicht codierbar sind? Ist es ein Overhead-Ding? – Maz

+1

@Maz im Wesentlichen nichts ist "standardmäßig" in Rust getan. Einer der Vorteile einer Systemsprache besteht darin, dass Ihnen alle Details des von Ihnen geschriebenen Codes bekannt sind. Sie möchten * eine * Struktur möglicherweise nicht serialisieren. Eine gegebene Struktur kann möglicherweise nicht serialisiert werden - sollte das eine Kompilierung verhindern? Eine Warnung geben? Fehlt still? Sie können sehen, warum die Entscheidung viel einfacher ist. – Shepmaster

+0

Gotcha. Vielen Dank! – Maz