是否可以像下面这样定义一个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;
}
}
在特定的实现中,需要提供特定的类型。