上下文:我正在开发一个需要将对象传递给另一个进程或通过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);
}
答案 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}