61

Aprende Rust, el lenguaje más amado por la comunidad

29086Puntos

hace 3 años

Rust es el lenguaje de programación más amado de todos; según la encuesta de Stackoverflow 2021 y lo ha sido por más de 6 años consecutivos.

En esta serie de blogs sobre Rust hablaremos de sus características, sus ventajas, sus limitaciones y sobre todo haremos un par de proyectos que puedas usar como referencia y portafolio.

Hola soy Hector Pulido y soy fiel creyente que un lenguaje de programación no debe alterar la lógica que tenemos los desarrolladores de software, pero es que al ver a Rust me brillan los ojitos, quiero decir, es un lenguaje de programación con el poder de C++ pero con una filosofía parecida a la de Python 🤩.

¿Qué es Rust?

Rust es un lenguaje de programación relativamente nuevo, fue diseñado inicialmente por Graydon Hoare en Mozilla research por la lejana época de 2006, fue lanzado finalmente en 2010. Ha crecido mucho en la industria ahora mismo es muy utilizado en Microsoft, Discord, Platzi (💚) y otras empresas, además de proyectos como Deno, Exa, Tor ¡y mucho más!

Te contamos: cómo usar Discord

Aquí algunas razones para aprender Rust

  1. Es un lenguaje enfocado en seguridad, velocidad y concurrencia, todo al mismo tiempo.
  2. Es un lenguaje moderno que toma lo mejor de muchos otros lenguajes, como temas de la programación funcional de Haskell o F#, los tipos de datos de C, el manejo de la memoria de C++, manejo de errores de Erlang, etc.
  3. Su ecosistema es extremadamente robusto y cuenta con uno de los mejores manejadores de paquetes de todos.
  4. NO HAY GARBAGE COLLECTOR (inserte meme de “agradecido con el de arriba”).
  5. Rust te OBLIGA a escribir tu código de tal manera que no hayan fugas de memoria y te obliga a que tu código siga las buenas prácticas.

Instalando Rust

Si te encuentras en windows:

  1. Por favor revisa que tengas instalado Visual C++ Build Tools 2013 o superior
  2. Puedes descargar e instalar la última version desde aqui: https://static.rust-lang.org/rustup/dist/i686-pc-windows-gnu/rustup-init.exe
  3. Sigue las instrucciones y al terminar revisa que las variables de entorno estén correctamente seteadas en %USERPROFILE%\.cargo\bin

Linux, macOS y otros sistemas basados en Unix;

  1. Corre este comando en tu shell curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  2. Sigue las instrucciones
  3. Revisa que las variables de entorno estén correctamente seteadas en $HOME/.cargo/bin

Para revisar que tu instalación sea correcta puedes usar el comando rustc --version si obtienes algo como esto: “rustc 1.52.1 (9bc8c42bb 2021-05-09)” significa que puedes continuar.

Nuestro primer programa en Rust

  1. Para crear un proyecto en Rust, hay varias formas, nosotros usaremos la mejor, para esto abre una consola en tu computador y escribe: cargo new mi_primer_programa_en_rust
  2. Vas a encontrar una estructura parecida a esta:
 |- Cargo.toml
 |- src
 ||- main.rs
 |- .git
 ||- ...
 |- .gitignore

Cargo nos ha generado nuestro proyecto ¡que ya contiene un hola mundo!, si abrimos el archivo main.rs encontraremos lo siguiente:

fnmain() {
    println!("Hello, world!");
}

Tal como parece, es un hola mundo en Rust, Si vienes de otros lenguajes notarás fácilmente el patrón, fn main es el nombre de la función inicial, en este caso no soporta parámetros y va con llaves.

println! es un macro, por ahora, digamos que un macro es como una función pero con esteroides, macro esta permite mostrar texto en pantalla, en este caso se escribe “Hello, world!”.

vamos a modificarlo un poco para introducir conceptos nuevos:

fnmain() {
    let nombre: String = String::from("Juan");
    mostrar_nombre(nombre);
}

fnmostrar_nombre(nombre_entrada: String) {
    println!("Hello, {}!", nombre_entrada);
}

Tomate un segundo para identificar los cambios:

  1. let nombre: String = ... es una variable, es decir, una caja en donde se puede guardar un valor de un tipo específico, en este caso una String con el valor “Juan”. Rust tiene muchos tipos, u8, u16, u32, u64, i8, i16, i32, i64, f32, f64, char, bool, String y varios más, en próximos posts los estaremos viendo.
  2. String::from("Juan"); Es una función de la clase String que devuelve un String si le entregamos una cadena de caracteres.
  3. Más adelante estamos definiendo una nueva función (ademas de main) fn mostrar_nombre(nombre_entrada: String) { esta función se llama mostrar_nombre y recibe como parámetro un String llamado nombre_entrada.
  4. Esta función hace un llamado a println! que ya lo vimos antes, solamente que en este caso, println! no muestra simplemente “Hello, world!” si no que muestra la cadena “Hello,” ademas de el parámetro nombre_entrada.
  5. llamamos a la función “mostrar_nombre” de esta forma mostrar_nombre(nombre);, recibe un parámetro, así que se lo ponemos dentro de los paréntesis.

Para ejecutar nuestro programa simplemente ve a la consola, escribe cargo run y presiona enter.

deberías ver algo parecido a esto:

   Compiling mi_primer_programa_en_rust v0.1.0 (/home/.../mi_primer_programa_en_rust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.27s
     Running `target/debug/mi_primer_programa_en_rust`
Hello, Juan!

Antes de continuar te reto a cambiar el nombre de “Juan” por tu nombre (y si te llamas Juan pon otra cosa, te estoy vigilando…) y lo corras de nuevo.

¿Qué puedes hacer con Rust?

La comunidad de rust es muy activa y está muy pendiente de que que frameworks y librerías son creadas dia con dia, tienen este concepto de “Are we yet?” que son páginas webs en donde recopilan librerías de temas en específicas

  1. ¿Es Rust apto para páginas webs? ¡Si! y es tremendamente rapido https://www.arewewebyet.org/
  2. ¿Podemos hacer videojuegos? Más o menos, tenemos los bloques, trae tu propio pegamento https://arewegameyet.rs/
  3. ¿Podemos hacer Machine learning? Hay mucha experimentacion en esta area http://www.arewelearningyet.com/

¿Subimos un poco el nivel? Reto para usar Rust

Quiero decirte que si no entendiste lo anterior no pasa nada, tenemos un curso totalmente gratuito en donde puedes aprender las bases de la programación, puedes empezar por ahí y luego seguir con este tutorial.

Vamos a hacer una calculadora, aprenderemos sobre operaciones matemáticas, I/0, paquetes de Rust y por supuesto, no podría ser un post mio sin un poco de ¡REGEX!.

Para buscar un paquete podemos irnos a crates.io encontrar el paquete que necesitemos, en este caso, regex.

Los paquetes suelen mostrar cómo instalarse, pero todos son muy parecidos, añadir al “Cargo.toml” la dependencia, regex = "1.5" en mi caso, quedaria asi.

[package]
name = "mi_primer_programa_en_rust"version = "0.1.0"
....

[dependencies]
regex = "1.5"

Este es el código de una calculadora semántica, es decir; como las calculadoras científicas, en donde introduces una expresión y te devuelve el resultado, sin que tu elijas el tipo de operación.

use regex::Regex;

fnmain() {
    let re = Regex::new(r"(\d+)\s?\+\s?(\d+)").unwrap();

    loop {
        letmut expresion = String::new();
        println!("Escribe tu suma :");
        std::io::stdin().read_line(&mut expresion).unwrap();
        let caps = re.captures(expresion.as_str()).unwrap();
        let izquierda: i32 = caps.get(1).unwrap().as_str().parse().unwrap();
        let derecha: i32 = caps.get(2).unwrap().as_str().parse().unwrap();
        let suma = izquierda + derecha;
        println!("Resultado: {}", suma);
    }
}

Si lo ejecutamos podemos ver algo como esto:

Escribe tu suma :1+1Resultado:2
Escribe tu suma :12 + 22Resultado:34
Escribe tu suma :99+ 1Resultado:100

Puedo ver tu cara, ya lo se, no te preocupes, me quedaré contigo hasta que lo tengamos hayamos entendido todo, vamos paso por paso.

  1. la línea use regex::Regex; sirve para importar una librería, en este caso Regex
  2. let re = Regex::new(r"(\d+)\s?\+\s?(\d+)").unwrap(); es una variable que contiene un Regex, fijate como no definimos el tipo, por que en este caso es obvio que es tipo Regex, a veces no será obvio, el compilador se asegurara de hacernoslo saber
  3. El Regex (\d+)\s?\+\s?(\d+) es sencillo, y aunque este no es un tutorial de Regex, te puedo decir que básicamente busca un patrón de la forma “Número, puede haber un espacio, signo de +, puede haber un espacio, Número” el trabajo de nuestro código es sumar los dos números, si quieres aprender regex te recomiendo el curso de platzi al respecto (con el que yo mismo aprendí sobre Regex https://platzi.com/cursos/expresiones-regulares/)
  4. loop { inicia un bucle infinito, el equivalente de un while True: en python
  5. let mut expresion = String::new(); Inicializamos una variable de tipo string, implícita, vacía con una cosilla muy interesante, tiene un mut este mut quiere decir que podemos modificar esa variable y es que si, las variables en Rust no se pueden modificar a menos que pongamos el mut, una de las tantas particularidades del lenguaje que lo hace increíble
  6. std::io::stdin().read_line(&mut expresion).unwrap(); Esta línea Lee lo que escribamos en la consola y devuelve el resultado a expresion, por cierto, ¿ves ese .unwrap()? es parte de la magia de rust, .read_line(&mut expresion) puede devolvernos o un error o un valor de string, el .unwrap() toma la respuesta positiva en caso de que todo haya salido bien.
  7. let caps = re.captures(expresion.as_str()).unwrap(); es una variable que ejecuta los match del regex en expresion, de nuevo, tomamos solo el valor sin error.
  8. let izquierda: i32 = caps.get(1).unwrap().as_str().parse().unwrap(); Tomamos el valor de la izquierda (o el primer número) con caps.get(1).unwrap() luego eso lo pasamos a str (no confundir con String) con .as_str() luego con .parse() lo pasamos a i32 (entero de 32 bits) y con .unwrap() sacamos solo el valor sin error. Nótese que en este caso el tipo de la variable SI es necesario por que el .parse() devuelve tipos genéricos
  9. Hacemos lo mismo con el valor derecho
  10. let suma = izquierda + derecha; Guardamos la suma en una nueva variable, de nuevo no es necesario el tipo, por que es una suma entre i32. Entre las operaciones matemáticas que podemos hacer están: Suma (+), Resta (-), Multiplicación (*), División (/) y módulo(%).
  11. println!("Resultado: {}", suma); Mostramos el resultado y el código se repite, para salir podemos presionar “CTRL + C”

Esto es solo el principio, en las próximas semanas estaré subiendo mas contenido sobre Rust. Ahora el reto para ti, cambia el código para que soporte restas, estoy seguro que puedes hacerlo, ¡comparte tu respuesta en la caja de comentarios!

Hector
Hector
hector_pulido_

29086Puntos

hace 3 años

Todas sus entradas
Escribe tu comentario
+ 2
Ordenar por:
30
29802Puntos

💚 si quieres una ruta de Rust

14
29086Puntos
3 años

Te puedo decir que estes pendiente al blog, van a salir muchos mas posts con proyectos cada vez mas interesantes.

Also: 💚

14
58771Puntos

Excelente Hector, gracias por compartir… Un curso o una ruta sobre Rust es lo que estoy esperando que tengamos pronto en Platzi… 🦀

4
29086Puntos
3 años

Si se hiciera ¿que te gustaria ver? 👀

10
58771Puntos
3 años

En mi opinión, lo ideal sería una ruta que comenzara con un curso de fundamentos de Rust, luego incluir programación orientada a objetos, también desarrollo de interfaces gráficas, ya que Rust permite la creación de GUI a través de las APIs nativas de la plataforma anfitriona y eso sería interesante de ver, y para mí, si se incluye webassembly con Rust… 😍 … Ojo, seguro hay temas interesantes pero esto es solo mi opinion.

1
4074Puntos
2 años

Me gustaria aprender desarrollo de contratos inteligentes para cadena de bloques de solana

6
70055Puntos

Se viene cursito de Rust en Platzi, buenisimo!

5
29086Puntos
3 años

No puedo negar ni confirmar, pero si se diera ¿que te gustaria ver? 👀

7
70055Puntos
3 años

Supongo lo básico, orientado a desarrollo web como API Rest, servidor HTTP. Ecosistema Rust, manejador de paquetes, conexión a BBDD, etc.
Me interesa el lenguaje ya que estoy viendo Deno y como bien dices en el post, está desarrollado en Rust.
Saludos!

2
206Puntos
3 años

Seria genial que ahondaran en detalle el como recoger parámetros por consola, ya que es algo que en la mayoría de tutoriales apenas se toca. Y como hacer cálculos matemáticos de mayor nivel como calculo exponencial, ver cual seria el equivalente en Rust de lo que en C es math.h y funciones que le permitan al programa interactuar con el sistema de formas como, limpiar la consola o abrir otros programas por consola, como en C se usa el system()

6
16793Puntos

Existe un curso de Rust en Platzi: Curso de Gestión de Servidores con Rust. Disfrutenlo!

2
10350Puntos
3 años

Pero no son videos 😕 yo lo empecé pero no sabía que estaba haciendo o la finalidad de usarlo y pues lo dejé.

1
22977Puntos
3 años

Tienes que leer la documentación oficial al mismo tiempo que avanzas en el curso para poder terminarlo.

5
2846Puntos

Genial !! parece que se viene curso de Rust? Me encantaria ver la sintaxis y proyectos simples, para pasar por su implementacion en videojuegos y rocket ❤️

5
29086Puntos
3 años

No te puedo decir si es el caso o no, pero se vienen mas posts con cada vez proyectos mas interesantes en rust (si le va bien a este 👀)

5
8249Puntos

Un backend para Flutter hecho en Rust, para aprenderlo a hacer en Platzi!!!

5
635Puntos

Un nuevo lenguaje que aprender, ya me siento emocionada por aprender algo nuevo

4
29086Puntos
3 años

Te lo recomiendo mucho, yo recomiendo tener un lenguaje de alto nivel (python, java, c#) y uno de bajo nivel (C++, Rust)

5
6815Puntos

Que gran aporte!!
Estaría genial un curso Introductorio de Rust, con algunos casos prácticos aplicables a la vida real y si se viene con web Assembly, que mejor.

4
29086Puntos
3 años

Si se hiciera ¿que proyecto te gustaria hacer? 👀

5
14720Puntos

Si quieren aprender Rust, hay un libro gratuito que pueden leer, con contenido tanto básico como avanzado: https://doc.rust-lang.org/book/

Me encantaría un curso avanzado de Rust en Platzi 😃 explicando temas que suelen ser complicados para los principiantes, como los lifetimes, traits y smart pointers

4
21163Puntos

Me gusto mucho, aunque fue una entrada un poco hardcode, pero disfrutable.

  • podrían ver revisar el blog por algunos errores ortográficos. 🙏🏻
  • Me uno a la moción de incluir temasde Web Assembly en una futura “Escuela de Rest”. 🙏🏻
4
12270Puntos

Aunque no me dedico a esto, suena bastante interesante
Le voy a dar un vistazo 💚

3
19384Puntos
porque es algo bueno que no implemente el "GARBAGE COLLECTOR"?
4
29086Puntos
3 años

El garbage collector es extremadamente lento, Rust lo evita utilizando lifetimes, basicamente cuando dejas de usar una variable, esta se borra automaticamente, eso hace a Rust extremadamente rapido y sobre todo seguro

2
19384Puntos
3 años

AHHHHHHHH eso tiene mas sentido, gracias!

3
14720Puntos
3 años

De hecho Discord migró su infraestructura de Go a Rust porque el garbage collector les estaba causando problemas de rendimiento

2
4156Puntos
2 años

Además el GC puede dar problemas para el tiempo real. Puede ponerse a trabajar en mal momento. O que te afecte al determinismo que requiere. Ejemplo de Rust para embedded y el real-time puede ver Drone-OS.

3
12034Puntos

Este es un espacio en linkedin para compartir diferentes recursos sobre Rust Lang, Web Assembly, Web Workers, etc. con quienes estén interesados. Saludos.

2
206Puntos

¿No se pueden recoger los parametros por consola directamente como numeros?

Tengo programas en C y quiero pasarlos a Rust, pero de la consola solo recoge strings y es un enrreo convertir todos esos strings en numeros con variables extra, ademas no encuentro cómo llenar un array por consola.

#include<stdio.h>#include<stdlib.h>int main(){
	int i,z;
	printf("Cuantos datos desea promediar?\n\t");
	scanf("%i",&z);
	float p[z];
	float k = 0;for(i=0;i<z;i++){
		printf("Inserte el factor %i: ",i+1);
		scanf("%f",&p[i]);
		k += p[i];
	}
	
	double l = k/z;
	printf("El promedio es %.20lf \n",l);return0;
}
2
4156Puntos
2 años

Ten en cuenta que scanf puede fallar por ejemplo si falla la conversión, lo que puede llevar a un UB.

Algo parecido lo puedes hacer usando scanf! de scanf (tambien tiene un sscanf!).

use scanf::scanf;

fnmain() {
	println!("Cuantos datos desea promediar?");
	letmut total_elementos: i32 = 0; // El mut es importante, scanf va a asignar el nuevo valor
	scanf!("{}", total_elementos);

	letmut valor_total: f64 = 0.0;	
	for i in0..total_elementos {
		print!("Inserte el factor {}: ", i+1);
		letmut n: f64 = 0.0; // El compilador obliga a darle un valor inicial porque si scanf! devuelve un error no estaría asignada si la usasesifletErr(error) = scanf!("{}", n) { // Puedes usar if scanf!("{}", n).is_err() { o .is_ok()panic!("Acabando debido al error: {}", error); // No me he puesto a mostrar el error y abortar con algo más bonito, perdón
		}
		valor_total += n;
	}
	
	let promedio: f64 = valor_total / total_elementos asf64;
	print!("El promedio es {}\n", promedio);
}

Puedes ver más ejemplo en la documentación.

También, cualquier string tiene un metodo .parse() como el que internamente usa scanf!:

letmut buffer = String::new();
if std::io::stdin().read_line(&mut buffer).is_ok() {
    let number: f64 = buffer.parse().expect("Aqui el mensaje del panic si la conversión falla, no me he parado a ponerlo bonito");
}
1
206Puntos
2 años

Super compadre, te pasaste, en serio gracias

1
9582Puntos

Increíble aporte Hector! Comparto la opinión de que esta fue una inducción hardcore a Rust pero me gusto mucho la manera en la que simplificaste conceptos programáticos específicos de Rust como la función unwrap, macros, mutabilidad, etc. En caso de que Platzi produjera un curso de Rust de nivel básico creo que es crucial el poder abordar la filosofía de programación que tiene Rust a través de su sintaxis, esto ya que aunque dicha sintaxis sea muy organizada y limpia no es para nada intuitiva y creo que la mejor manera de entender el lenguaje es entendiendo conceptualmente que hace el código línea a línea como tu bien lo abordaste en este artículo. Gracias de nuevo y espero pronto podamos verte en formato video compartiendo tu experiencia con Rust!