Entradas

Aprendiendo Rust (y presentando PageTop)

Llevo ya bastante tiempo siguiendo Rust de cerca. Es un lenguaje de programación que goza de mucha popularidad como demuestran las encuestas anuales de stackoverflow. De hecho, fue votado como lenguaje más amado en 2021 y lleva haciéndolo así unos cuantos años. Se compara mucho con Go y tiene, como éste y otros lenguajes, sus defensores incondicionales y sus detractores acérrimos.

En mi caso quiero aprenderlo porque es diferente a lo que he estado usando en los últimos años, y tengo mucho interés en conocerlo en profundidad. Quizás sea el último lenguaje de programación que estudie a fondo en mi carrera profesional. Lo que sí es seguro es que le voy a dedicar mucho más esfuerzo que simplemente trastear o probar como he hecho con otros lenguajes.

Rust no es fácil, aunque está extensa y cuidadosamente documentado, y su ecosistema ha crecido enormemente. Es difícil abarcarlo y conocer todos los recursos de la librería estándar, o las librerías creadas por la comunidad. Algunas son auténticos frameworks, muchos de ellos del mundo de los videojuegos. Incluso va camino de convertirse en el segundo lenguaje del kernel Linux.

PageTop, un proyecto para aprender

Por ahora, el tiempo que puedo lo dedico a uno de esos proyectos mascota que tanto nos gusta tener a los programadores para aprender y experimentar. Lo he llamado PageTop y quiero que utilice algunas de las librerías más relevantes para la creación de soluciones web.

Usaré SuitePro para el seguimiento del proyecto, y GitHub para el repositorio. Todo en español.

Y contaré la experiencia por aquí, las dificultades encontradas, pero también esos pequeños logros que tanto se disfrutan.

¿Cómo dividir una cadena en Rust?

La mejor opción es usar split(), que divide la cadena aplicando diferentes criterios de separación, por ejemplo, indicando una cadena o un carácter de separación:

cadena1.split("separador");
cadena2.split('/');

O separando por caracteres numéricos:

cadena3.split(char::is_numeric);

Por espacios en blanco:

let subcadenas = "Dos subcadenas".split_whitespace();

O usando expresiones regulares:

let subcadenas = Regex::new(r"\s").unwrap().split("Uno Dos Tres");

Otra opción es usar lines() para separar por saltos de línea:

let subcadenas = "Línea 1\nLínea 2\nLínea 3".lines();

En todos los casos devuelve un iterador que puede recorrerse en bucle:

for s in subcadenas {
    println!("{}", s);
}

O se puede pasar a un vector usando collect():

let vector = subcadenas.collect::<Vec<&str>>();
// O también...
let vector: Vec<&str> = subcadenas.collect();

Estos son todos los ejemplos en Rust Playground:

GhostCell, separando permisos de los datos en Rust

El lenguaje Rust ofrece un enfoque prometedor para la programación de sistemas seguros. Un valor puede ser un alias o puede ser mutable, pero no ambas cosas al mismo tiempo.

Pero implementar estructuras de datos basadas en punteros con acceso compartido, como grafos o listas doblemente enlazadas, requiere poder mutar estados que son alias. Para admitir tales estructuras de datos Rust proporciona una serie de APIs que ofrecen la denominada mutabilidad interior: la capacidad de mutar datos usando métodos sobre una referencia compartida. Desafortunadamente, las APIs existentes sacrifican la flexibilidad, el acceso concurrente y/o el rendimiento a cambio de la seguridad.

Este artículo académico propone una API llamada GhostCell que separa de forma segura los permisos de los datos. La propuesta se acompaña de su implementación y ejemplos y de comparativas de rendimiento con otras APIs.

Explained: How does async work in Rust?

Asynchronous programming is a concept which allows not blocking the program workflow when waiting for the results of certain actions. So you can open a large file or query a database, but your program will continue processing each line afterwards.

Explained: How does async work in Rust? from rust