上下文:我正在使用一个需要将对象传递到另一个进程或通过tcp连接传递给它的库,所以我不希望用户关心库进行序列化的方式。
是否可以通用使用“可编码”?
如果是这样,如何将“Encodable”类型参数绑定(bind)到T,以便可以在“main”中使用“Foo.send”方法?
可以通过不需要“主要”提及序列化格式的方式来完成吗?
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);
}
最佳答案
您可以使用如下所示的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}