gpt4 book ai didi

unit-testing - 可以获取任何类型的结构函数

转载 作者:行者123 更新时间:2023-11-29 08:16:37 28 4
gpt4 key购买 nike

我有下一个将基本 Rust 类型序列化为 BERT 格式的代码:

pub struct Serializer;

pub trait Serialize<T> {
fn to_bert(&self, data: T) -> Vec<u8>;
}

impl Serializer {

pub fn new() -> Serializer {
Serializer{}
}

pub fn term_to_binary<T: Any + Debug>(&self, data: T) -> Vec<u8> {
self.to_bert(data)
}

pub fn generate_term(&self, tag: BertTag, data: Vec<u8>) -> Vec<u8> {
let mut binary = vec![tag as u8];
binary.extend(data.iter().clone());
binary
}

pub fn convert_string_to_binary(&self, data: &str) -> Vec<u8> {
let binary_string = data.as_bytes();
let binary_length = binary_string.len() as u8;
let mut binary = vec![0u8, binary_length];
binary.extend(binary_string.iter().clone());
binary
}

pub fn merge_atoms(&self, atom_1: Vec<u8>, atom_2: Vec<u8>) -> Vec<u8> {
let mut binary: Vec<u8> = atom_1.clone();
binary.extend(atom_2.iter().clone());
binary
}

pub fn get_bert_atom(&self) -> Vec<u8> {
let binary_string = self.convert_string_to_binary(BERT_LABEL);
self.generate_term(BertTag::Atom, binary_string)
}
}

impl Serialize<u8> for Serializer {
fn to_bert(&self, data: u8) -> Vec<u8> {
self.generate_term(BertTag::SmallInteger, vec![data])
}
}

impl Serialize<bool> for Serializer {
fn to_bert(&self, data: bool) -> Vec<u8> {
let boolean_string = data.to_string();
let binary_boolean = self.convert_string_to_binary(&boolean_string);

let bert_atom = self.get_bert_atom();
let boolean_atom = self.generate_term(BertTag::Atom, binary_boolean);

self.merge_atoms(bert_atom, boolean_atom)
}
}

主要问题是如何根据 Rust 语言 term_to_binary 函数正确实现我们可以将一些基本类型(如 integersbooleans 等等)。当 term_to_binary 获取了一些数据时,我能否以某种方式“即时”获取类型并调用特定函数?

之后,我想编写一些测试,以确保一切正常。例如它可以是这样的:

#[cfg(test)]
mod test {
use super::{Serializer};

#[test]
fn test_serialize_bool() {
let serializer = Serializer::new();

println!(serializer.term_to_binary(true), [100, 0, 4, 116, 114, 117, 101])
}
}

对于整数、映射、元组测试用例看起来会更加相似。

最佳答案

查看term_to_binary您尝试调用的实现 self.to_bert(data) , 即 Serialize::to_bert(&self, data) .为了能够进行此调用,Self (即 Serializer )必须实现 Serialize<T> ,因此我们必须将此绑定(bind)添加到 term_to_binary :

pub fn term_to_binary<T>(&self, data: T) -> Vec<u8>
where Self: Serialize<T>
{
self.to_bert(data)
}

您可以添加一个新的可序列化类型 T实现 Serialize<T> for Serializer , 可能不改变 Serializer ,即 great .

请注意,使用 Any将需要动态调度,但对于您的示例而言,这不是必需的,因此您无需支付此费用。

关于unit-testing - 可以获取任何类型的结构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38763786/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com