如何为特征实现许多类似的方法?
How to implement many similar methods for trait?
我正在实施 Serde Serializer
trait,它有很多方法。它们中的许多看起来非常相似(例如整数类型的那些只是将字节复制到某个缓冲区),所以以某种方式生成它们会很好。我可以编写一些通用函数或宏来用一种方法(宏)实现其中的许多功能吗?
我有这样的东西:
use serde::Serializer;
use byteorder::{WriteBytesExt, LittleEndian};
struct MySerializer {
...
}
impl Serializer for MySerializer {
fn serialize_i32(&mut self, v:i32) -> Result<(), Error> {
try!(self.buffer.write_i32::<LittleEndian>(v));
}
fn serialize_u8(&mut self, v:u8) -> Result<(), Error> {
try!(self.buffer.write_u8::<LittleEndian>(v));
}
// many similar looking functions here
}
我在 serde/bench 项目中找到了示例:
macro_rules! impl_nums {
($ty:ty, $dser_method:ident, $visitor_method:ident, $reader_method:ident) => {
#[inline]
fn $dser_method<V>(&mut self, mut visitor: V) -> Result<V::Value>
where V: Visitor
{
let value = try!(self.reader.$reader_method::<NativeEndian>());
visitor.$visitor_method(value)
}
};
}
impl_nums!(u16, deserialize_u16, visit_u16, read_u16);
impl_nums!(u32, deserialize_u32, visit_u32, read_u32);
....
目前看来这是最好的方法 - concat_idents!
macro is unstable, and is not very useful acording to this github issue。
我正在实施 Serde Serializer
trait,它有很多方法。它们中的许多看起来非常相似(例如整数类型的那些只是将字节复制到某个缓冲区),所以以某种方式生成它们会很好。我可以编写一些通用函数或宏来用一种方法(宏)实现其中的许多功能吗?
我有这样的东西:
use serde::Serializer;
use byteorder::{WriteBytesExt, LittleEndian};
struct MySerializer {
...
}
impl Serializer for MySerializer {
fn serialize_i32(&mut self, v:i32) -> Result<(), Error> {
try!(self.buffer.write_i32::<LittleEndian>(v));
}
fn serialize_u8(&mut self, v:u8) -> Result<(), Error> {
try!(self.buffer.write_u8::<LittleEndian>(v));
}
// many similar looking functions here
}
我在 serde/bench 项目中找到了示例:
macro_rules! impl_nums {
($ty:ty, $dser_method:ident, $visitor_method:ident, $reader_method:ident) => {
#[inline]
fn $dser_method<V>(&mut self, mut visitor: V) -> Result<V::Value>
where V: Visitor
{
let value = try!(self.reader.$reader_method::<NativeEndian>());
visitor.$visitor_method(value)
}
};
}
impl_nums!(u16, deserialize_u16, visit_u16, read_u16);
impl_nums!(u32, deserialize_u32, visit_u32, read_u32);
....
目前看来这是最好的方法 - concat_idents!
macro is unstable, and is not very useful acording to this github issue。