rust - una - ¿Cómo echo un valor u64 a un tipo numérico genérico?
la descarga de solidos suspendidos desde una mina de fosfato (1)
Me gustaría lanzar un valor u64 a un tipo numérico genérico, algo así como
fn f<T: AppropriateTrait>(v: u64) -> T {
v as T
}
y que se comporte semánticamente como, por ejemplo, 259u64 as u8
, es decir, debería tomar los bits menos significativos. Desafortunadamente, la función FromPrimitive::from_u64
devuelve una Option<T>
, con None
si el valor de entrada no cabe.
Esto aquí funciona:
fn f<T: FromPrimitive + Int + ToPrimitive>(v: u64) -> T {
T::from_u64(v & T::max_value().to_u64().unwrap()).unwrap()
}
Pero es muy detallado y poco elegante. ¿Hay una mejor manera?
Editar : solo estoy interesado en enviar contenido a tipos enteros como u8, u16, etc., sin elementos funky.
Una manera de hacerlo de manera particularmente eficiente es definir su propio rasgo con el efecto deseado; especialmente si estás llegando a algo más complejo, esto a menudo será lo que desees (aunque definitivamente no siempre). Para este caso, puedes ir por algo como esto:
trait FromU64 {
fn from_u64(v: u64) -> Self;
}
macro_rules! impl_from_u64 {
($($ty:ty)*) => {
$(
impl FromU64 for $ty {
#[inline]
fn from_u64(v: u64) -> $ty {
v as $ty
}
}
)*
}
}
impl_from_u64!(u8 u16 u32 u64 usize);
Su f::<T>
sería entonces <T as FromU64>::from_u64
, o alternativamente
fn f<T: FromU64>(v: u64) -> T {
FromU64::from_u64(T)
}