我们可以为字节向量定义一个特征及其实现:
pub trait MKF {
fn do_smth(&self) -> String;
}
impl MKF for Vec<u8> {
fn do_smth(&self) -> String {
String::from("hello")
}
}
我想提供一个适用于特征声明本身中的向量的默认实现。因为该特征中还有其他一揽子实现,所以我希望我可以将它们全部分组在那里。这可能吗?
我尝试过例如
pub trait MKF<V: Vec<u8>> {
fn get_appendix(&self) -> String {...}
fn is_live(&self) -> bool {...}
fn is_valid(&self) -> bool {...}
fn do_smth(&self) -> String {
String::from("hello")
}
}
这不起作用,因为 Vec 是一个结构体而不是一个特征。尝试应用于 fn 时也会发生同样的情况:
pub trait MKF {
fn do_smth<V: Vec<u8>>(&self) {...}
}
有办法做到这一点吗?根本问题是,在
do_smth
中,我需要将对象转换为字节切片。因此,只有可以转换为字节切片的对象才应该使用此特征。
您无法在特征本身内提供默认实现 - 默认实现必须适用于实现该特征的任何类型。
您可以创建一个适用于任何实现特征的类型的全面实现,例如
AsRef<[u8]>
。该一揽子实现必须实现特征中的所有功能(除了那些具有实际默认实现的功能)。
pub trait MKF {
fn get_appendix(&self) -> String { "Hey".to_string() }
fn is_live(&self) -> bool { true }
fn is_valid(&self) -> bool { false }
fn do_smth(&self) -> usize;
}
impl<T: AsRef<[u8]>> MKF for T {
fn do_smth(&self) -> usize {
let x = self.as_ref();
x.len()
}
}
pub fn main() {
let s = "Hello World".to_string();
println!("{}", s.do_smth());
}