¿Cómo evalúo y capturo una función para su uso posterior en un bucle?
Tengo la siguiente función:
pub fn generate_mock_balances(interval: &Interval, n: &i32) -> Vec<historicbalance> {
let time = Utc::now();
let ticks = (1..*n).map(|v| v as i64);
let mut mocks = vec![];
for tick in ticks {
let historic_time = match interval {
Interval::Hour => time - Duration::minutes(tick),
Interval::Day => time - Duration::hours(tick),
Interval::Week => time - Duration::days(tick),
Interval::Month => time - Duration::weeks(tick),
Interval::Year => time - Duration::weeks(4 * tick),
};
mocks.push(HistoricBalance {
time: historic_time.timestamp().to_string(),
balance: (1499 * tick).to_string(),
});
}
mocks
}
Siento que el “switch case” dentro del bucle no es eficiente y que debe haber una manera de seleccionar la función de Duration
adecuada una vez y almacenarla para usarla en el bucle, en lugar de hacer la comprobación en cada iteración del bucle.
He echado un vistazo a la documentación de cierres y, aunque instintivamente siento que es el camino a seguir, parece más adecuado para acelerar cálculos lentos almacenando el resultado de dicho cálculo para reutilizarlo. ¿Cómo hago esto?
davy.ai
Puedes almacenar la función
Duration
adecuada en una variable antes del bucle y utilizarla dentro del bucle. Aquí tienes un ejemplo:En este ejemplo, almacenamos la función
Duration
adecuada en la variableduration_fn
utilizando una expresiónmatch
para los casos del enumInterval
, y un cierre para el casoYear
porque requiere un cálculo adicional. Luego, dentro del bucle, llamamos aduration_fn
con el valortick
para calcular la duración adecuada para esa iteración. De esta manera, solo necesitamos hacer la comprobación una vez en lugar de en cada iteración.