如何在Vec的泛型类型上重载函数或方法?



我需要一个对vector进行操作的函数,该函数具有默认实现以及针对几种不同类型的专门实现。

我可以完成这个:

trait Foo<T>
where
T: std::fmt::Display,
{
fn foo(&self) {
println!("Generic: {}", self.vectorize()[0]);
}
fn vectorize(&self) -> &Vec<T>;
}
impl Foo<f32> for Vec<f32> {
fn vectorize(&self) -> &Vec<f32> {
self
}
}
impl Foo<f64> for Vec<f64> {
fn foo(&self) {
println!("Specialized: {}", self[0]);
}
fn vectorize(&self) -> &Vec<f64> {
self
}
}
fn main() {
vec![1.2_f32, 2.3].foo();
vec![3.4_f64, 4.5].foo();
}
这个策略是用默认实现定义一个trait,然后在需要的时候专门化它。我的问题是,我们真的需要知道类型是一个Vec,因此需要这个辅助函数vectorize来获得正确的类型。这使事情变得有点冗长,我想做得更好。

我真的不在乎是否有特质;我只需要一个对不同的底层Vec类型进行专门化的函数,我知道如何做到这一点的唯一方法是通过使用trait。

您想要直接访问trait中向量的索引值,这是由std的Index trait定义的行为,并由Vec结构体实现。所以你只需要指定Footrait也需要Indextrait来实现。

use std::ops::Index;
trait Foo<T>: Index<usize, Output = T>
where
T: std::fmt::Display,
{
fn foo(&self) {
println!("Generic: {}", self[0]);
}
}
impl Foo<f32> for Vec<f32> {}
impl Foo<f64> for Vec<f64> {
fn foo(&self) {
println!("Specialized: {}", self[0]);
}
}
fn main() {
vec![1.2_f32, 2.3].foo();
vec![3.4_f64, 4.5].foo();
}

最新更新