ps4 - rust traduccion
En Rust, ¿cuál es el equivalente idiomático de Haskell''s[n..m]? (3)
Tenga en cuenta que esta respuesta pertenece a una versión anterior a la versión 1.0 de Rust y no se aplica a 1.0. Específicamente, se eliminó
Vec::from_fn
.
Probablemente no haya nada realmente idiomático a partir de ahora. Hay un puñado de funciones de conveniencia para construir vectores, por ejemplo, puede usar Vec::from_fn
:
Vec::from_fn(m+1-n, |i| i+n)
¿Cómo puedo producir una lista que contenga todos los enteros en Rust? Estoy buscando el equivalente de Haskell''s [n..m]
o el range(n, m+1)
de Python range(n, m+1)
pero no puedo encontrar nada.
Soy consciente de la función int::range
y pensé que era lo que estaba buscando, pero está hecho para iterar en un rango, no para producirlo.
Tenga en cuenta que esta respuesta pertenece a una versión anterior a la versión 1.0 de Rust y no se aplica a 1.0. Específicamente, se eliminaron
std::iter::range
ystd::iter::range_inclusive
.
A partir de Rust 1.0.0-alpha, la forma más sencilla de lograr esto es usar las funciones de conveniencia proporcionadas en el módulo std::iter
: range
y range_inclusive
, que devuelven iteradores que generan una lista de números en el rango [bajo, alto] o [bajo, alto], respectivamente.
Además, puedes construir un vector a partir de un iterador utilizando el método de collect
:
use std::iter::range_inclusive;
let first_hundred: Vec<i32> = range_inclusive(1, 100).collect();
println!("upper bound inclusive: {:?}, exclusive: {:?}",
first_hundred,
range(101, 201).collect::<Vec<_>>());
Tenga en cuenta que el valor de retorno de collect
tiene su tipo explícitamente especificado en los dos usos anteriores. Normalmente, el compilador Rust puede inferir los tipos de expresiones sin una especificación explícita, pero collect
es uno de los casos más comunes para los cuales el tipo no se puede inferir por completo, en este caso porque no puede inferir un tipo concreto que implemente el rasgo FromIterator<A>
, el tipo de devolución de collect
.
El tipo de valor de retorno genérico se puede especificar como un tipo explícito en una declaración de definición de let
o en línea utilizando la sintaxis function::<Type>()
. Como la inferencia falla solo debido a que no se conoce un tipo concreto que implementa FromIterator<A>
, es posible, al especificar explícitamente un tipo genérico, dejar "agujeros" para los argumentos de tipo que se deducirán, lo que significa _
. Esto se hace con la segunda llamada para collect
arriba, en la expresión Vec<_>
, se especifica explícitamente que el contenedor que recibe los elementos de la collect
es un Vec<T>
, pero el compilador determina qué tipo exacto debe ser. Actualmente, los enteros cuyos tipos se dejan sin especificar y no se pueden inferir caen de nuevo a i32
(entero de máquina de 32 bits) como valor predeterminado.
Ahora es posible usar ..
en Rust:
let vec: Vec<_> = (n .. m + 1).collect();
te da un Vec
de todos los números de n
a m
.
Como se señala en el comentario de Shepmaster, tenga cuidado, no funcionará si necesita un rango hasta el valor máximo del tipo ( 255
para u8
).