impl Trait en Rust
Tipos anónimos en las firmas: cualquier argumento que encaje, cualquier retorno que cumpla.
fn total(values: impl IntoIterator<Item = i32>) -> i32 {
values.into_iter().sum()
}
fn evens(limit: i32) -> impl Iterator<Item = i32> {
(0..limit).filter(|n| n % 2 == 0)
}
fn adder(step: i32) -> impl Fn(i32) -> i32 {
move |n| n + step
}
fn main() {
println!("{}", total(vec![1, 2, 3]));
println!("{:?}", evens(10).collect::<Vec<i32>>());
let add_five = adder(5);
println!("{}", add_five(37));
}
Cómo funciona
- En posición de argumento es la forma corta de un bound.
- En posición de retorno esconde el tipo concreto.
- Así se devuelven closures e iteradores.
Palabras clave y builtins usados aquí
FnIntoIteratorIteratorVecfni32letmove
El intento, en números
- Líneas
- 18
- Caracteres a escribir
- 397
- Tokens
- 154
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 88 segundos.
Paso 4 de 4 en Genéricos; paso 7 de 19 en Traits y genéricos.