Tutorial Rust

A continuación veremos todos los aspectos basicos y avanzados de Rust.

Hello World

Primero que todo el famoso "Hello World!". En un jupyter notebook no es necesario tener una funcion main sin embargo en un proyecto normal de Rust es necesario tenerla.

Conceptos basicos de programación

Formateo

El formateo puede ser por medio del orden de las variables en corchetes

O puede ser llamándolo por el nombre de la variable en los corchetes

Tipos y declaración de variables

Primitivos

En rust tenemos dos grupos grandes de primiticos los: escalares y los compuestos.

Escalares:
Compuestos:

Tipos personalizados

Struct: son estructuras, similares a las que tiene el lenguaje C. Hay tres tipos de estructuras:

Enum: permite la creacion de un tipo que puede ser uno de muchas variantes

Constantes: Rust tiene dos tipos de constantes

Mutabilidad

Por defecto TODAS las variables son inmutables, para modificarlas es necesario utilizar la palabra reservada mut

Scope y shadowing

Todas las variables tienen un "scope" o alcance, la vida de la variable esta delimitada por un bloque referenciado por dos corchetes {}

Casting

En Rust no existe el casting implícito entre tipos de datos, pero se puede forzar explícitamente usando la palabra reservada [as]

Conversiones

Tambien es posible, hacer casting a tus propios tipos de datos y estructuras por medio de las conversiones.

From, Into

From: este trait permite definir como un tipo de dato personalizado puede crearse a si mismo desde otro tipo de dato

Into: este trait es reciproco a From. Permite definir como crear otro tipo de dato a partir de un tipo de dato personalizado

Expresiones

Ya hemos visto muchos ejemplos de expresiones en Rust pero queremos añadir datos adicionales especiales de este lenguaje. Por ejemplo, los bloques de código cuentan como expresiones por lo tanto pueden ser asignados a una variable.

Estructuras de control

if/else

La unica diferencia con otros lenguajes es que la condición no necesita estar entre parentesis

loop

Ciclo infinito

while

Parecido a un loop pero con condicion

for y rangos

Un poco mas parecido al for en python

match

Es un switch de C

Funciones

Las funciones se crean por medio de la palabra clave fn. Tiene como estructura fn nombre (parametros) -> Tipo de dato de retorno

Metodos

Son funciones atadas a objetos

Clousures

Son parecidas a una función lambda

Ownership

Ahora veamos lo aprendido en las presentaciones en código. Como recuerdan los valores tienen un unico dueño y solo se pueden prestar o transferir (la ownership). Esto previene que los recursos sean liberados mas de una vez.

Despues de que un recurso se transfiera, el dueño previo no puede usar ese recurso.

Movimientos parciales

Esto permite que parte de la variable se transfiera y otra parte permanezca. En este caso la variable padre no puede usarse de manera completa, solo lo que permanece.

Borrowing

Esta caracteristica la usamos cuando queremos acceder a datos de otra variable sin tomar propiedad de este. Esto se hace por medio de las referencias que se denotan por un &. Es importante decir que las referencias tanto como las variables son inmutables a menos que se especifique lo contrario.

Lifetimes

Es una construcción que el compilador usa para que todos los "borrows" sean válidos. Especificamente el tiempo de vida de una variable empieza cuando esta es creada y termina cuando es destruida. Este está relacionado con los scopes.

Concurrencia

Para crear hilos llamamos la funcion thread::spawn y le pasamos una clousure (si no recuerdan que es esto miren la sección de Clousures) con el codigo que deseamos correr en los hilos dentro.

Podemos esperar que todos los hilos terminen para hacer otra cosa por medio de las JoinHandle