簡體   English   中英

如何實現許多類似的特質方法?

[英]How to implement many similar methods for trait?

我正在實現Serde Serializer特性 ,它具有很多方法。 它們中的許多看起來非常相似(例如整數類型的那些只是將字節復制到某個緩沖區),因此以某種方式生成它們會很好。 我可以用一種方法(宏)編寫一些通用函數或宏來實現它們中的許多嗎?

我有這樣的事情:

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! 宏是不穩定的,根據這個github問題並不是很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM