字节向量特征的默认实现

问题描述 投票:0回答:1

我们可以为字节向量定义一个特征及其实现:

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
中,我需要将对象转换为字节切片。因此,只有可以转换为字节切片的对象才应该使用此特征。

rust traits
1个回答
0
投票

您无法在特征本身内提供默认实现 - 默认实现必须适用于实现该特征的任何类型。

您可以创建一个适用于任何实现特征的类型的全面实现,例如

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());

}
© www.soinside.com 2019 - 2024. All rights reserved.