具有不同参数类型的 trait实现



是否可以像下面这样定义一个trait:

pub trait DataValidator {
fn validate_data(&self, data: TBD) -> bool;
}

,其中TBD类型可以是不同的数据类型,如u32,Vec<u8>,Vec<Vec<u8>>,…对不同的枚举有不同的实现?

这个想法是为不同的数据类型创建一个验证器。我有以下enum:

pub enum DataType {
Text,
Number,
Array,
}

我有一个结构体,它使用那个enum

pub struct Validator {
pub data_type: DataType
}

我想实现Validator的特性,但是validate_data函数的输入总是不一样的,或者至少这是我想要涵盖的。

例如,假设我有一个验证器名称validator,data_type设置为Text。然后,我想调用validate_data函数,如validator.validate_data(data),其中数据是Vec<u8>。它只需要验证Vec的长度是否在一定的范围内。

但是假设我有另一个名为validator2的验证器,data_type设置为Array。我想将不同DataTypes的数组传递给validate_data函数,并使用相同的逻辑验证它们中的每一个,但为此,我需要trait对输入类型具有灵活性。这可能吗?

您可以实现虚拟特征SupportedDataType只是为了表明您支持的类型,并将每个DataValidator特征与某些类型(ValidatedDataType)连接起来,这将是特征SupportedDataType,然后您可以更改每种实现的类型(据我所知是必需的功能)。

trait SupportedDataType {}
impl SupportedDataType for String {}
impl SupportedDataType for i32 {}
pub trait DataValidator {
type ValidatedDataType: SupportedDataType;
fn validate_data(&self, data: Self::ValidatedDataType) -> bool;
}
struct Validator {}
impl DataValidator for Validator {
type ValidatedDataType = u64;
fn validate_data(&self, data: Self::ValidatedDataType) -> bool {
return true;
}
}

在特定的实现中,需要提供特定的类型。

最新更新