vuelos una suspendidos solidos resueltos probabilidad pequeños para numero mayor introducción ingenieros importantes fosfato estadística estadistica ejercicios distribuciones distribucion desde descarga cortos capitulo aviones aeropuertos rust

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) }