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 🤩.
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
%USERPROFILE%\.cargo\bin
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$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.
cargo new mi_primer_programa_en_rust
|- 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:
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.String::from("Juan");
Es una función de la clase String que devuelve un String si le entregamos una cadena de caracteres.fn mostrar_nombre(nombre_entrada: String) {
esta función se llama mostrar_nombre y recibe como parámetro un String llamado nombre_entrada.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.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.
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
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.
use regex::Regex;
sirve para importar una librería, en este caso Regexlet 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(\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/)loop {
inicia un bucle infinito, el equivalente de un while True:
en pythonlet 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íblestd::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.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.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éricoslet 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(%).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!
💚 si quieres una ruta de Rust
Te puedo decir que estes pendiente al blog, van a salir muchos mas posts con proyectos cada vez mas interesantes.
Also: 💚
Excelente Hector, gracias por compartir… Un curso o una ruta sobre Rust es lo que estoy esperando que tengamos pronto en Platzi… 🦀
Si se hiciera ¿que te gustaria ver? 👀
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 a lo de webassembly
Me gustaria aprender desarrollo de contratos inteligentes para cadena de bloques de solana
Existe un curso de Rust en Platzi: Curso de Gestión de Servidores con Rust. Disfrutenlo!
Pero no son videos 😕 yo lo empecé pero no sabía que estaba haciendo o la finalidad de usarlo y pues lo dejé.
Tienes que leer la documentación oficial al mismo tiempo que avanzas en el curso para poder terminarlo.
Se viene cursito de Rust en Platzi, buenisimo!
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!
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()
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 ❤️
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 👀)
Un nuevo lenguaje que aprender, ya me siento emocionada por aprender algo nuevo
Te lo recomiendo mucho, yo recomiendo tener un lenguaje de alto nivel (python, java, c#) y uno de bajo nivel (C++, Rust)
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.
Si se hiciera ¿que proyecto te gustaria hacer? 👀
Un backend para Flutter hecho en Rust, para aprenderlo a hacer en Platzi!!!
Buena intro 10/10
Muchas gracias, espero que el resto del post te agrade 🤩
Me gusto mucho, aunque fue una entrada un poco hardcode, pero disfrutable.
Gracias por el feedback
Aunque no me dedico a esto, suena bastante interesante
Le voy a dar un vistazo 💚
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
AHHHHHHHH eso tiene mas sentido, gracias!
De hecho Discord migró su infraestructura de Go a Rust porque el garbage collector les estaba causando problemas de rendimiento
¿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; }
Super compadre, te pasaste, en serio gracias
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!