如何将“Encodable”绑定到类型参数?

时间:2014-08-19 21:46:39

标签: generics types rust traits

上下文:我正在开发一个需要将对象传递给另一个进程或通过tcp连接的库,因此我不希望用户关心库进行序列化的方式。

“Encodable”的泛型使用是否可行?

如果是这样,我如何将“Encodable”类型参数绑定到T,所以我可以在“main”中使用“Foo.send”方法?

是否可以通过不需要“main”提及序列化格式的方式来完成?

extern crate serialize;

use serialize::{json, Encodable};

struct Foo<T>;

impl<T> Foo<T> {
    fn send(&self, data: T) {
        // error: failed to find an implementation of trait 
        // serialize::serialize::Encodable<serialize::json::
        // Encoder<'_>,std::io::IoError> for T
        println!("{}", json::Encoder::str_encode(&data));
    }
}

#[deriving(Encodable)]
struct DataX {
    a : int,
}

fn main() {
    let sourceX = DataX { a : 1 };
    let fooX = Foo::<DataX>;
    fooX.send(sourceX);
}

1 个答案:

答案 0 :(得分:3)

您可以使用bounded type parameter,如下所示和in the playpen

extern crate serialize;

use serialize::{json, Encodable, Encoder};
use std::io::{IoError};

struct Foo<T>;

impl<'a, T: Encodable<json::Encoder<'a>, IoError>> Foo<T> {
    fn send(&self, data: T) {
        println!("{}", json::Encoder::str_encode(&data));
    }
}

#[deriving(Encodable)]
struct DataX {
    a : int,
}

fn main() {
    let sourceX = DataX { a : 1 };
    let fooX = Foo::<DataX>;
    fooX.send(sourceX);
}

输出:

{"a":1}