Мне нужен метод объекта-черты, который принимает несколько типов чисел c, каждый из которых будет преобразован в f64
. Следующее не компилируется, поскольку NumCast
реализует черту Sized
:
use num_traits::NumCast;
pub trait Grapher {
fn add(&mut self, key: &str, number: &dyn NumCast);
fn show(&self);
}
Обобщенная c версия такого метода отключает Grapher
для создания объекта:
fn agregar<T: NumCast>(&mut self, key: &str, number: &T);
Мое решение состояло в том, чтобы создать другую черту:
pub trait F64Convertible {
fn convert(&self) -> f64;
}
impl F64Convertible for i32 {
fn convert(&self) -> f64 {
*self as f64
}
}
impl F64Convertible for u8 {
fn convert(&self) -> f64 {
*self as f64
}
}
// same for many numeric types...
// use the trait:
pub trait Grapher {
fn add(&mut self, key: &str, number: &dyn F64Convertible);
fn show(&self);
}
Я хотел бы избежать повторяющихся функций преобразования в моем коде, возможно, используя NumCast
или подобную черту.