{"id":50,"date":"2025-03-29T14:27:27","date_gmt":"2025-03-29T18:27:27","guid":{"rendered":"https:\/\/juredev.com\/blog\/?p=50"},"modified":"2025-03-29T14:27:28","modified_gmt":"2025-03-29T18:27:28","slug":"aprendiendo-rust-leyendo-codigo-fuente-guia-para-principiantes","status":"publish","type":"post","link":"https:\/\/juredev.com\/blog\/2025\/03\/aprendiendo-rust-leyendo-codigo-fuente-guia-para-principiantes\/","title":{"rendered":"Aprendiendo Rust Leyendo C\u00f3digo Fuente: Gu\u00eda para Principiantes"},"content":{"rendered":"\n<p>\u00bfAlguna vez te has preguntado qu\u00e9 hay detr\u00e1s de las librer\u00edas de Rust? En este art\u00edculo te invito a explorar el c\u00f3digo fuente de Rust de una manera sencilla y pr\u00e1ctica. No importa si acabas de empezar o ya tienes algo de experiencia: aqu\u00ed aprender\u00e1s a leer c\u00f3digo como un profesional, paso a paso, con ejemplos claros, herramientas \u00fatiles y proyectos reales. \u00a1Vamos a sumergirnos en el mundo de Rust juntos!<\/p>\n\n\n\n<p>Tabla de Contenidos (Niveles: B\u00e1sico | Intermedio | Avanzado):<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Conceptos B\u00e1sicos de Rust (B\u00e1sico )<\/li>\n\n\n\n<li>Herramientas para Explorar C\u00f3digo (B\u00e1sico )<\/li>\n\n\n\n<li>Leyendo M\u00f3dulos Sencillos (B\u00e1sico )<\/li>\n\n\n\n<li>Gesti\u00f3n de Memoria para Mortales (Intermedio )<\/li>\n\n\n\n<li>Punteros Inteligentes en Detalle (Intermedio )<\/li>\n\n\n\n<li>Traits y Objetos Trait (Avanzado)<\/li>\n\n\n\n<li>Proyectos Reales para Analizar (Avanzado)<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">1. Conceptos B\u00e1sicos de Rust (B\u00e1sico)<\/h2>\n\n\n\n<p>Antes de lanzarnos al c\u00f3digo, repasemos lo esencial con ejemplos que cualquiera puede entender.<\/p>\n\n\n\n<p><strong>Ownership y Pr\u00e9stamos<\/strong><\/p>\n\n\n\n<p>Rust tiene reglas \u00fanicas para manejar la memoria, como el concepto de ownership (propiedad). Mira este ejemplo:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:5px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nfn main() {\n    let s1 = String::from(\"hola\"); \/\/ s1 es el due\u00f1o de \"hola\"\n    let s2 = s1;                   \/\/ s1 \"cede\" la propiedad a s2\n    \/\/ println!(\"{}\", s1);         \/\/ \u00a1Error! s1 ya no existe aqu\u00ed\n}\n<\/code><\/p>\n\n\n\n<p>Esto es lo que Rust llama move semantics: cuando asignas s1 a s2, el valor se \u00abmueve\u00bb y s1 deja de ser v\u00e1lido.<\/p>\n\n\n\n<p><strong>Option y Result<\/strong><\/p>\n\n\n\n<p>Rust no usa excepciones como otros lenguajes. En su lugar, tiene <strong>Option <\/strong>(para valores que pueden no existir) y <strong>Result <\/strong>(para operaciones que pueden fallar). Por ejemplo:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nfn dividir(a: f64, b: f64) -> Result<f64, String> {\n    if b == 0.0 {\n        Err(\"No se puede dividir por cero\".to_string())\n    } else {\n        Ok(a \/ b)\n    }\n}\n<\/code><\/p>\n\n\n\n<p><strong>Prueba t\u00fa<\/strong>: Cambia el valor de <code>b<\/code>  a 0.0 y mira qu\u00e9 pasa cuando lo ejecutas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Herramientas para Explorar C\u00f3digo (B\u00e1sico)<\/h2>\n\n\n\n<p>Leer c\u00f3digo es m\u00e1s f\u00e1cil con las herramientas adecuadas. Aqu\u00ed tienes dos que te encantar\u00e1n:<\/p>\n\n\n\n<p><strong>A. rust-analyzer en VSCode<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Instala la extensi\u00f3n \u00abrust-analyzer\u00bb en VSCode.<\/li>\n\n\n\n<li>Haz clic derecho en algo como String y selecciona Ir a Definici\u00f3n.<\/li>\n\n\n\n<li>\u00a1Epa! Est\u00e1s viendo el c\u00f3digo fuente de String en la librer\u00eda est\u00e1ndar.<\/li>\n<\/ol>\n\n\n\n<p><strong>B.<\/strong> <strong>cargo doc &#8211;open<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<p>\u00bfQuieres ver la documentaci\u00f3n de tu propio proyecto? En la terminal, escribe:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\n cargo doc --open\n<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Leyendo M\u00f3dulos Sencillos (Intermedio)<\/h2>\n\n\n\n<p>Empecemos con algo simple: \u00bfc\u00f3mo funciona un <strong>Vec<\/strong> (el equivalente a una lista en Rust)?<\/p>\n\n\n\n<p><strong>std::vec::Vec: \u00bfC\u00f3mo crece?<\/strong><\/p>\n\n\n\n<p>Mira como creas un vector:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nlet mut v = Vec::new(); \/\/ Empieza vac\u00edo, capacidad = 0\nv.push(1);              \/\/ Ahora tiene capacidad para 4 elementos\nv.push(2);              \/\/ Capacidad = 4, pero solo 2 elementos usados\n<\/code><\/p>\n\n\n\n<p>As\u00ed se ve en la memoria:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\n+---------+----------+---------+\n| Puntero | Capacidad| Longitud|  \n+---------+----------+---------+\n    |          4          2\n    v  \nHeap: [1, 2, _, _]  \/\/ \"_\" = espacio reservado pero vac\u00edo\n<\/code><\/p>\n\n\n\n<p>Prueba t\u00fa: Ejecuta <strong>cargo expand<\/strong> en un proyecto con <strong>vec![1, 2]<\/strong> y descubre c\u00f3mo se transforma ese c\u00f3digo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Gesti\u00f3n de Memoria para Mortales (Intermedio)<\/h2>\n\n\n\n<p>El ownership puede sonar intimidante, pero es m\u00e1s simple de lo que parece. Piensa en un String como un libro en una biblioteca:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Solo una persona puede llev\u00e1rselo a casa (propiedad).<\/li>\n\n\n\n<li>Puedes prestarlo para que lo lean (&amp;T) o lo editen (&amp;mut T), pero con reglas claras.<\/li>\n<\/ul>\n\n\n\n<p>Mira este ejemplo:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nfn prestar_libro(libro: &String) {\n    println!(\"Leyendo: {}\", libro);\n}\n\nfn main() {\n    let mi_libro = String::from(\"El Se\u00f1or de los Anillos\");\n    prestar_libro(&mi_libro); \/\/ Lo presto para leer\n    prestar_libro(&mi_libro); \/\/ \u00a1Puedo prestarlo otra vez!\n}\n<\/code><\/p>\n\n\n\n<p>Aqu\u00ed, &amp;mi_libro es un pr\u00e9stamo inmutable: varios pueden leerlo, pero nadie lo cambia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Punteros Inteligentes en Detalle (Avanzado)<\/h2>\n\n\n\n<p>Los punteros inteligentes son como herramientas avanzadas para manejar memoria. Veamos los m\u00e1s comunes:<\/p>\n\n\n\n<p><strong>Box&lt;T&gt;<\/strong><\/p>\n\n\n\n<p>Guarda datos en el heap (memoria din\u00e1mica):<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nlet b = Box::new(5);\nprintln!(\"b = {}\", b); \/\/ b = 5\n<\/code><\/p>\n\n\n\n<p><strong>Rc&lt;T><\/strong><\/p>\n\n\n\n<p>Permite que varios \u00abdue\u00f1os\u00bb compartan un valor:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nuse std::rc::Rc;\n\nlet a = Rc::new(10);\nlet b = Rc::clone(&a);\nprintln!(\"Due\u00f1os: {}\", Rc::strong_count(&a)); \/\/ 2}\n<\/code><\/p>\n\n\n\n<p><strong>RefCell&lt;T><\/strong><\/p>\n\n\n\n<p>Te deja modificar datos en tiempo de ejecuci\u00f3n, con ciertas reglas:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nuse std::cell::RefCell;\n\nlet data = RefCell::new(5);\n*data.borrow_mut() += 1;\nprintln!(\"Dato: {}\", data.borrow()); \/\/ Dato: 6\n<\/code><\/p>\n\n\n\n<p><strong>Prueba t\u00fa:<\/strong> Crea una estructura que combine Rc y RefCell para compartir un valor mutable entre varios sitios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Traits y Objetos Trait (Avanzado)<\/h2>\n\n\n\n<p>Los traits son como plantillas de comportamiento. Imagina que quieres que diferentes formas se puedan \u00abdibujar\u00bb:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\ntrait Dibujable {\n    fn dibujar(&self);\n}\n\nstruct Circulo {\n    radio: f64,\n}\n\nimpl Dibujable for Circulo {\n    fn dibujar(&self) {\n        println!(\"C\u00edrculo de radio {}\", self.radio);\n    }\n}\n\nstruct Rectangulo {\n    ancho: f64,\n    alto: f64,\n}\n\nimpl Dibujable for Rectangulo {\n    fn dibujar(&self) {\n        println!(\"Rect\u00e1ngulo de {}x{}\", self.ancho, self.alto);\n    }\n}\n\nfn dibujar_forma(forma: &dyn Dibujable) {\n    forma.dibujar();\n}\n\nfn main() {\n    let circulo = Circulo { radio: 5.0 };\n    let rectangulo = Rectangulo { ancho: 3.0, alto: 4.0 };\n    dibujar_forma(&circulo);\n    dibujar_forma(&rectangulo);\n}\n<\/code><\/p>\n\n\n\n<p><strong>Prueba t\u00fa:<\/strong> A\u00f1ade un <em>Triangulo <\/em>con sus propios datos y haz que tambi\u00e9n sea <em>Dibujable<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Proyectos Reales para Analizar (Avanzado)<\/h2>\n\n\n\n<p><strong>A. Proyecto <em>regex<\/em><\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Visita <a href=\"https:\/\/docs.rs\/regex\/latest\/regex\/\">docs.rs\/regex<\/a>.<\/li>\n\n\n\n<li>Haz clic en \u00abSource\u00bb y busca la funci\u00f3n <strong>find<\/strong>.<\/li>\n\n\n\n<li>Sigue el c\u00f3digo para ver c\u00f3mo encuentra patrones.<\/li>\n<\/ol>\n\n\n\n<p><strong>Pregunta:<\/strong> \u00bfQu\u00e9 hace <strong><em>regex <\/em><\/strong>si le das un patr\u00f3n inv\u00e1lido?<\/p>\n\n\n\n<p><strong>B. Tu Primera Contribuci\u00f3n<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Busca un proyecto como <em><strong><a href=\"https:\/\/github.com\/serde-rs\/serde\" target=\"_blank\" rel=\"noreferrer noopener\">serde<\/a> <\/strong><\/em>con etiquetas \u00abgood first issue\u00bb.<\/li>\n\n\n\n<li>Lee las gu\u00edas de contribuci\u00f3n.<\/li>\n\n\n\n<li>Intenta mejorar la documentaci\u00f3n o un test y env\u00eda <em>un pull request<\/em>.<\/li>\n<\/ol>\n\n\n\n<p><strong>C. Crea un Stack Gen\u00e9rico<\/strong><\/p>\n\n\n\n<p>Aqu\u00ed tienes una base para una pila (<em>stack<\/em>) con <strong>Vec<\/strong>:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nstruct Stack<T> {\n    elementos: Vec<T>,\n}\n\nimpl<T> Stack<T> {\n    fn new() -> Self {\n        Stack { elementos: Vec::new() }\n    }\n\n    fn push(&mut self, elemento: T) {\n        self.elementos.push(elemento);\n    }\n\n    fn pop(&mut self) -> Option<T> {\n        self.elementos.pop()\n    }\n\n    fn is_empty(&self) -> bool {\n        self.elementos.is_empty()\n    }\n}\n\nfn main() {\n    let mut stack = Stack::new();\n    stack.push(1);\n    stack.push(2);\n    stack.push(3);\n\n    while let Some(elemento) = stack.pop() {\n        println!(\"Elemento: {}\", elemento);\n    }\n}\n<\/code><\/p>\n\n\n\n<p><strong>Prueba t\u00fa:<\/strong> A\u00f1ade un m\u00e9todo <em>peek <\/em>que muestre el elemento superior sin sacarlo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Recursos para Seguir Aprendiendo<\/h2>\n\n\n\n<p><strong>Libros y Tutoriales<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/doc.rust-lang.org\/book\/\">El Libro de Rust<\/a>: Lee sobre ownership (cap\u00edtulo 4) y gen\u00e9ricos (cap\u00edtulo 10).<\/li>\n\n\n\n<li><a href=\"https:\/\/doc.rust-lang.org\/rust-by-example\/\">Rust by Example<\/a>: Ejercicios pr\u00e1cticos.<\/li>\n<\/ul>\n\n\n\n<p><strong>Comunidades<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/users.rust-lang.org\/\">Rust Users Forum<\/a>: Pregunta lo que sea.<\/li>\n\n\n\n<li><a href=\"https:\/\/t.me\/rust_es\">Rust en Espa\u00f1ol<\/a>: \u00danete al grupo de Telegram.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">La pr\u00e1ctica hace al Maestro<\/h2>\n\n\n\n<p>Leer c\u00f3digo Rust es como aprender a leer un mapa: al principio parece confuso, pero con pr\u00e1ctica, empiezas a ver los caminos claros. Usa las herramientas y ejemplos de esta gu\u00eda para explorar a tu ritmo. No te preocupes si no lo entiendes todo de una vez; modifica ejemplos, juega con el c\u00f3digo y comparte tus descubrimientos con otros.<\/p>\n\n\n\n<p><strong>Siguientes pasos:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Clona un proyecto peque\u00f1o como <a href=\"https:\/\/github.com\/BurntSushi\/ripgrep\">ripgrep<\/a>.<\/li>\n\n\n\n<li>Usa <strong><em>cargo doc &#8211;open<\/em><\/strong> para ver sus m\u00f3dulos.<\/li>\n\n\n\n<li>\u00a1Crea tu propio crate y comp\u00e1rtelo con el mundo!<\/li>\n<\/ol>\n\n\n\n<p><strong>Mini glosario:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Trait:<\/strong> Una \u00abreceta\u00bb de funciones que un tipo puede seguir.<\/li>\n\n\n\n<li><strong>Macro:<\/strong> C\u00f3digo que escribe m\u00e1s c\u00f3digo por ti.<\/li>\n\n\n\n<li><strong>Crate:<\/strong> Un paquete o librer\u00eda de <strong>Rust<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>Espero que con esta gu\u00eda, tienes todo lo que necesitas para empezar a explorar <strong>Rust<\/strong> sin frustrarte. Buen viaje, sigamos codificando.<\/p>\n\n\n\n<p><strong>Ap\u00e9ndice: Soluciones a Ejercicios<\/strong><\/p>\n\n\n\n<p><strong>Ejercicio de Vec:<\/strong> Con cargo <em><strong>expand<\/strong><\/em>,<em><strong> vec![1, 2] <\/strong><\/em>se convierte en:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nlet mut v = Vec::new();\nv.push(1);\nv.push(2);\n<\/code><\/p>\n\n\n\n<p><strong>Ejercicio de regex:<\/strong> Si el patr\u00f3n falla, <strong><em>Regex::new<\/em><\/strong> devuelve <em><strong>Result <\/strong><\/em>con el error.<\/p>\n\n\n\n<p><strong>Soluci\u00f3n del Stack con peek:<\/strong><\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nimpl<T> Stack<T> {\n    fn peek(&self) -> Option<&#038;T> {\n        self.elementos.last()\n    }\n}\n<\/code><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfAlguna vez te has preguntado qu\u00e9 hay detr\u00e1s de las librer\u00edas de Rust? En este art\u00edculo te invito a explorar el c\u00f3digo fuente de Rust de una manera sencilla y pr\u00e1ctica. No importa si acabas de empezar o ya tienes algo de experiencia: aqu\u00ed aprender\u00e1s a leer c\u00f3digo como un profesional, paso a paso, con [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[10],"class_list":["post-50","post","type-post","status-publish","format-standard","hentry","category-desarrollo","tag-rust"],"_links":{"self":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/50","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/comments?post=50"}],"version-history":[{"count":0,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/50\/revisions"}],"wp:attachment":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/media?parent=50"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/categories?post=50"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/tags?post=50"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}