es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo satisfacer el requisito del rasgo `Sum` para f32?

Tengo el siguiente rasgo que estoy tratando de implementar:

pub trait CentralMoment<output =="" f32="">
where
    Output: Copy,
{
    fn mean(&self) -> Output;
}
impl<t> CentralMoment for [T] {
    fn mean(&self) -> f32 {
        let sum: f32 = self.iter().sum();
        sum / self.len() as f32
    }
}

Mi problema está en la línea let sum: f32 = self.iter().sum(). El compilador me está diciendo:

the trait bound f32: Sum<&T> is not satisfied
–> src/lib.rs:45:36
|
45 | let sum: f32 = self.iter().sum();
| ^^^ the trait Sum<&T> is not implemented for f32
|
help: consider extending the where bound, but there might be an alternative better way to express this requirement
|
42 | T: Copy, f32: Sum<&T>

pero incluso cuando intento incluir f32: Sum<&T>, sigo obteniendo el mismo error.

¿Qué estoy haciendo mal aquí y cómo puedo resolver este problema? Gracias de antemano, y por favor avíseme si necesita alguna aclaración adicional.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que el rasgo Sum no está implementado para &T, donde T es el tipo de elementos en la rebanada.

    Para resolver este problema, puedes usar una función map para convertir cada elemento en la rebanada a f32 antes de sumarlos.

    Aquí tienes una implementación actualizada:

    use std::iter::Sum;
    
    pub trait CentralMoment<output =="" f32="">
    where
        Output: Copy,
    {
        fn mean(&self) -> Output;
    }
    
    impl<t> CentralMoment for [T]
    where
        T: Copy,
        f32: Sum,
    {
        fn mean(&self) -> f32 {
            let sum: f32 = self.iter().map(|&x| x as f32).sum();
            sum / self.len() as f32
        }
    }
    

    En esta implementación actualizada, agregamos un nuevo límite f32: Sum para asegurarnos de que el rasgo Sum esté implementado para f32. También usamos la función map para convertir cada elemento en la rebanada a f32 antes de sumarlos.

    Con estos cambios, la implementación debería compilar sin errores.

Comments are closed.