Te damos la bienvenida a Comprehensive Rust 🦀
1.
Desarrollo del curso
❱
1.1.
Estructura del curso
1.2.
Combinaciones de teclas
1.3.
Traducciones
2.
Usando Cargo
❱
2.1.
Ecosistema Rust
2.2.
Ejemplos de Código
2.3.
Ejecutar Cargo a nivel local
Día 1: mañana
3.
Te damos la bienvenida
4.
Hola, Mundo
❱
4.1.
¿Qué es Rust?
4.2.
Ventajas de Rust
4.3.
Playground
5.
Tipos y valores
❱
5.1.
Hola, Mundo
5.2.
Variables
5.3.
Valores
5.4.
Aritmética
5.5.
Inferencia de tipos
5.6.
Ejercicio: Fibonacci
❱
5.6.1.
Solución
6.
Básicos de Control de Flujo
❱
6.1.
Expresiones if
6.2.
Bucles
❱
6.2.1.
for
6.2.2.
loop
6.3.
break y continue
❱
6.3.1.
Etiquetas
6.4.
Bloques y ámbitos
❱
6.4.1.
Ámbitos y Shadowing
6.5.
Funciones
6.6.
Macros
6.7.
Ejercicio: secuencia de Collatz
❱
6.7.1.
Solución
Día 1: Tarde
7.
Te damos la bienvenida
8.
Tuplas y arrays
❱
8.1.
Arrays
8.2.
Tuplas
8.3.
Iteración de Arreglos (Arrays)
8.4.
Patrones y Desestructuración
8.5.
Ejercicio: arrays anidados
❱
8.5.1.
Solución
9.
Referencias
❱
9.1.
Enums compartidas
9.2.
Referencias exclusivas
9.3.
Slices: &\[T\]
9.4.
Cadenas de texto (Strings)
9.5.
Ejercicio: geometría
❱
9.5.1.
Solución
10.
Tipos definidos por el usuario
❱
10.1.
Estructuras con nombre
10.2.
Estructuras de tuplas
10.3.
Enumeraciones
10.4.
Estático
10.5.
Const (constantes)
10.6.
Aliases de tipo
10.7.
Ejercicio: eventos de ascensor
❱
10.7.1.
Solución
Día 2: Mañana
11.
Te damos la bienvenida
12.
Correspondencia de Patrones
❱
12.1.
Correspondencia de Valores
12.2.
Desestructurando Structs
12.3.
Desestructurando Enums
12.4.
Control de Flujo Let
12.5.
Ejercicio: evaluación de expresiones
❱
12.5.1.
Solución
13.
Métodos y Traits
❱
13.1.
Métodos
13.2.
Traits
❱
13.2.1.
Implementación de Traits
13.2.2.
Supertraits
13.2.3.
Tipos de datos asociados
13.3.
Derivación de Traits
13.4.
Ejercicio: registro genérico
❱
13.4.1.
Solución
Día 2: tarde
14.
Te damos la bienvenida
15.
Genéricos
❱
15.1.
Funciones genéricas
15.2.
Tipos de Datos Genéricos
15.3.
Traits Genéricos
15.4.
Trait Bounds
15.5.
impl Trait
15.6.
dyn Trait
15.7.
Ejercicio: min genérico
❱
15.7.1.
Solución
16.
Tipos de la Biblioteca Estándar
❱
16.1.
Biblioteca estándar
16.2.
Documentación
16.3.
Option
16.4.
Result
16.5.
String
16.6.
Vec (Vectores)
16.7.
HashMap
16.8.
Ejercicio: Contador
❱
16.8.1.
Solución
17.
Traits de la biblioteca estándar
❱
17.1.
Comparaciones
17.2.
Operadores
17.3.
From e Into
17.4.
Probando
17.5.
Read y Write
17.6.
Default, sintaxis de actualización de structs
17.7.
Cierres
17.8.
Ejercicio: ROT13
❱
17.8.1.
Solución
Día 3: Mañana
18.
Te damos la bienvenida
19.
Manejo de Memoria
❱
19.1.
Revisión de la memoria de programas
19.2.
Métodos de Gestión de Memoria
19.3.
Ownership
19.4.
Semántica de movimiento
19.5.
Trait Clone
19.6.
Tipos Copy
19.7.
Trait Drop
19.8.
Ejercicio: Constructores
❱
19.8.1.
Solución
20.
Punteros inteligentes
❱
20.1.
Box<T>
20.2.
Rc
20.3.
Objetos Trait Poseídos
20.4.
Ejercicio: Árbol binario
❱
20.4.1.
Solución
Día 3: Tarde
21.
Te damos la bienvenida
22.
Préstamos (Borrowing)
❱
22.1.
Emprestar (borrow) un valor
22.2.
Verificación de Préstamos
22.3.
Errores de Préstamo
22.4.
Mutabilidad Interior
22.5.
Ejercicio: Estadísticas de Salud
❱
22.5.1.
Solución
23.
Duraciones de vida
❱
23.1.
Anotaciones de duración de vida
23.2.
Elisión de duración de vida
23.3.
Duraciones de vida de estructuras (structs)
23.4.
Ejercicio: Análisis de Protobuf
❱
23.4.1.
Solución
Día 4: Mañana
24.
Te damos la bienvenida
25.
Iteradores
❱
25.1.
Iterator
25.2.
IntoIterator
25.3.
FromIterator
25.4.
Ejercicio: Encadenamiento de métodos del iterador
❱
25.4.1.
Solución
26.
Módulos
❱
26.1.
Módulos
26.2.
Jerarquía del sistema de archivos
26.3.
Visibilidad
26.4.
use, super, self
26.5.
Ejercicio: Módulos para una biblioteca GUI
❱
26.5.1.
Solución
27.
Probando
❱
27.1.
Módulos de Pruebas
27.2.
Otros tipos de pruebas
27.3.
Lints de compiladores y Clippy
27.4.
Ejercicio: Algoritmo de Luhn
❱
27.4.1.
Solución
Día 4: Tarde
28.
Te damos la bienvenida
29.
Manejo de Errores
❱
29.1.
Pánicos
29.2.
Result
29.3.
Operador Try (Intentar)
29.4.
Conversiones Try (Intentar)
29.5.
Trait Error
29.6.
thiserror y anyhow
29.7.
Ejercicio: Reescribir con Result
❱
29.7.1.
Solución
30.
Unsafe Rust
❱
30.1.
Unsafe
30.2.
Dereferenciación de Punteros Sin Formato
30.3.
Variables Estáticas Mutables
30.4.
Uniones
30.5.
Funciones Inseguras (Unsafe)
30.6.
Implementación de Traits Unsafe (Inseguras)
30.7.
Ejercicio: Envoltorio de FFI
❱
30.7.1.
Solución
Android
31.
Te damos la bienvenida
32.
Configurar
33.
Reglas de Compilación (Build)
❱
33.1.
Binarios
33.2.
Biblioteca
34.
AIDL
❱
34.1.
Tutorial de Servicio de Cumpleaños
❱
34.1.1.
Interfaz
34.1.2.
API de Servicios
34.1.3.
Servicio
34.1.4.
Servidor
34.1.5.
Despliegue
34.1.6.
Cliente
34.1.7.
Cambio de API
34.1.8.
Actualizando Implementaciones
34.2.
Tipos AIDL
❱
34.2.1.
Tipos Primitivos
34.2.2.
Tipos Array
34.2.3.
Enviando Objectos
34.2.4.
Variables
34.2.5.
Enviando Archívos
35.
Probando
❱
35.1.
GoogleTest
35.2.
Simulaciones
36.
Almacenamiento de registros
37.
Interoperabilidad
❱
37.1.
Con C
❱
37.1.1.
Llamar a C con Bindgen
37.1.2.
Llamar a Rust desde C
37.2.
Con C++
❱
37.2.1.
El Modulo Puente (Bridge)
37.2.2.
Rust Bridge (Puente)
37.2.3.
C++ generado
37.2.4.
Bridge en C++
37.2.5.
Tipos de datos compartidos
37.2.6.
Enums compartidos
37.2.7.
Manejo de Errores en Rust
37.2.8.
Manejo de Errores en C++
37.2.9.
Tipos adicionales
37.2.10.
Compilar en Android: C++
37.2.11.
Compilar en Android: Genrules
37.2.12.
Compilar en Android: Rust
37.3.
Con Java
38.
Ejercicios
Chromium
39.
Te damos la bienvenida
40.
Configurar
41.
Comparación de los ecosistemas de Chromium y Cargo
42.
Política
43.
Reglas de Compilación (Build)
❱
43.1.
Código inseguro
43.2.
Depender de código de Rust desde Chromium C++
43.3.
Visual Studio Code
43.4.
Ejercicio
44.
Probando
❱
44.1.
Biblioteca rust_gtest_interop
44.2.
Reglas GN para pruebas de Rust
44.3.
Macro chromium::import!
44.4.
Ejercicio
45.
Interoperabilidad con C++
❱
45.1.
Ejemplos
45.2.
Limitaciones de CXX
45.3.
Manejo de Errores en CXX
❱
45.3.1.
Manejo de Errores: Ejemplo QR
45.3.2.
Manejo de Errores: Ejemplo PNG
45.4.
Usar CXX en Chromium
45.5.
Ejercicio
46.
Añadir crates de terceros
❱
46.1.
Configurar Cargo.toml
46.2.
Configurar gnrt_config.toml
46.3.
Descargar crates
46.4.
Generar reglas de compilación gn
46.5.
Resolución de problemas
❱
46.5.1.
Compilar secuencias de comandos que generan código
46.5.2.
Compilar secuencias de comandos que compilan C++ o llevan a cabo acciones arbitrarias
46.6.
Depender de un crate
46.7.
Revisiones y auditorías
46.8.
Comprobaciones en el código fuente de Chromium
46.9.
Mantener los crates actualizados
46.10.
Ejercicio
47.
Poner en práctica todo lo aprendido: ejercicio
48.
Soluciones de Ejercicios
Bare Metal: mañana
49.
Te damos la bienvenida
50.
no_std
❱
50.1.
Un Pequeño Ejemplo
50.2.
alloc
51.
Microcontroladores
❱
51.1.
MMIO sin procesar
51.2.
PAC
51.3.
Crates HAL
51.4.
Crates de Soporte de Placa
51.5.
El Patrón de Tipo de Estado
51.6.
embedded-hal
51.7.
probe-rs y cargo-embed
❱
51.7.1.
Depuración
51.8.
Otros proyectos
52.
Ejercicios
❱
52.1.
Brújula
52.2.
Soluciones
Bare Metal: tarde
53.
Procesadores de aplicaciones
❱
53.1.
Iniciación a Rust
53.2.
Ensamblador en línea
53.3.
MMIO
53.4.
Escribir un controlador UART
❱
53.4.1.
Más traits
53.5.
Un controlador UART mejor
❱
53.5.1.
Bitflags
53.5.2.
Varios registros
53.5.3.
Conductor
53.5.4.
Cómo usarlo
53.6.
Almacenamiento de registros
❱
53.6.1.
Cómo usarlo
53.7.
Excepciones
53.8.
Otros proyectos
54.
Crates útiles
❱
54.1.
zerocopy
54.2.
aarch64-paging
54.3.
buddy_system_allocator
54.4.
tinyvec
54.5.
spin
55.
Android
❱
55.1.
vmbase
56.
Ejercicios
❱
56.1.
Controlador RTC
56.2.
Soluciones
Concurrencia: mañana
57.
Te damos la bienvenida
58.
Hilos
❱
58.1.
Hilos Simples
58.2.
Hilos con ámbito
59.
Canales
❱
59.1.
Transmisores y Receptores
59.2.
Canales sin límites
59.3.
Canales delimitados
60.
Send y Sync
❱
60.1.
Traits de Marcador
60.2.
Send
60.3.
Sync
60.4.
Ejemplos
61.
Estado compartido
❱
61.1.
Arc
61.2.
Mutex
61.3.
Ejemplo
62.
Ejercicios
❱
62.1.
La cena de los filósofos
62.2.
Comprobador de enlaces multihilo
62.3.
Soluciones
Concurrencia: tarde
63.
Te damos la bienvenida
64.
Conceptos básicos de Async
❱
64.1.
async/await
64.2.
Future
64.3.
Runtimes (Tiempos de Ejecución)
❱
64.3.1.
Tokio
64.4.
Tasks
65.
Canales y Control de Flujo
❱
65.1.
Canales asíncronos
65.2.
Unir
65.3.
Seleccionar
66.
Inconvenientes
❱
66.1.
Bloqueo del ejecutor
66.2.
Pin
66.3.
Traits asíncronos
66.4.
Cancelación
67.
Ejercicios
❱
67.1.
La cena de los filósofos
67.2.
Aplicación de chat de difusión
67.3.
Soluciones
Conclusiones
68.
¡Gracias!
69.
Glosario
70.
Otros recursos
71.
Créditos
Light
Rust
Coal
Navy
Ayu
Comprehensive Rust 🦀
English
Brazilian Portuguese (Português do Brasil)
Chinese Simplified (汉语)
Chinese Traditional (漢語)
Japanese (日本語)
Korean (한국어)
Farsi (فارسی)
Spanish (Español)
Ukrainian (українська)
Soluciones de Ejercicios
Las soluciones a los ejercicios de Chromium están en
esta serie de listas de cambios
.