{"id":29467,"date":"2024-09-03T15:15:26","date_gmt":"2024-09-03T13:15:26","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=29467"},"modified":"2024-09-03T15:15:28","modified_gmt":"2024-09-03T13:15:28","slug":"navegando-por-los-smart-pointers-en-rust","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/","title":{"rendered":"Navegando por los Smart Pointers en Rust"},"content":{"rendered":"\n<p>En mi <a href=\"https:\/\/www.ascinfo.dev\/blog\/ownership-en-rust\">art\u00edculo anterior sobre Ownership<\/a>, exploramos c\u00f3mo Rust maneja la propiedad de los datos de manera segura, permiti\u00e9ndonos evitar muchos de los errores comunes relacionados con la memoria en otros lenguajes. Este es el pilar fundamental que hace que Rust sea tan poderoso. Ahora, es momento de profundizar en un concepto relacionado: los <em>smart pointers<\/em>.<\/p>\n\n\n\n<p>Si bien los <em>lifetimes<\/em>, de los que habl\u00e9 en un art\u00edculo relacionado que pronto estar\u00e1 disponible en el blog de <a href=\"https:\/\/leanmind.es\/es\/blog\/\">LeanMind<\/a>, juegan un rol crucial en la gesti\u00f3n de las referencias y su validez, los <em>smart pointers<\/em> nos proporcionan una manera a\u00fan m\u00e1s avanzada de manejar la memoria y otros recursos en Rust.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-que-son-los-smart-pointers\">\u00bfQu\u00e9 son los Smart Pointers?<\/h2>\n\n\n\n<p>Un <em>smart pointer<\/em> es un tipo de dato que no solo contiene una direcci\u00f3n de memoria (como un puntero tradicional), sino que tambi\u00e9n tiene capacidades adicionales que permiten gestionar autom\u00e1ticamente la memoria y otros recursos. A diferencia de las referencias regulares (<code>&amp;T<\/code> y <code>&amp;mut T<\/code>), los <em>smart pointers<\/em> implementan el trait <code>Deref<\/code> y, en muchos casos, el trait <code>Drop<\/code>. Esto les da la capacidad de comportarse como punteros mientras administran la memoria o recursos de manera m\u00e1s inteligente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-tipos-comunes-de-smart-pointers-en-rust\">Tipos Comunes de Smart Pointers en Rust<\/h2>\n\n\n\n<p>Rust ofrece varios <em>smart pointers<\/em> en su est\u00e1ndar, cada uno con diferentes usos y beneficios. Aqu\u00ed veremos algunos de los m\u00e1s importantes:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-box-lt-t-gt\"><code>Box&lt;T&gt;<\/code><\/h3>\n\n\n\n<p>El m\u00e1s b\u00e1sico de los <em>smart pointers<\/em>, <code>Box&lt;T&gt;<\/code>, almacena datos en el heap en lugar del stack. Esto es especialmente \u00fatil para valores grandes o cuando necesitas un tama\u00f1o de tipo que no se conoce en tiempo de compilaci\u00f3n, como en el caso de estructuras recursivas.<\/p>\n\n\n\n<p><strong>Ejemplo con estructuras recursivas<\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">enum<\/span> <span class=\"hljs-title\">List<\/span><\/span> {\n    Cons(<span class=\"hljs-built_in\">i32<\/span>, <span class=\"hljs-built_in\">Box<\/span>&lt;List&gt;),  <span class=\"hljs-comment\">\/\/ `Box&lt;List&gt;` permite que Rust conozca el tama\u00f1o en tiempo de compilaci\u00f3n.<\/span>\n    Nil,\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">main<\/span><\/span>() {\n    <span class=\"hljs-keyword\">let<\/span> list = List::Cons(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-built_in\">Box<\/span>::new(List::Cons(<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-built_in\">Box<\/span>::new(List::Cons(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-built_in\">Box<\/span>::new(List::Nil))))));\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>En este ejemplo, <code>Box&lt;T&gt;<\/code> permite que <code>List<\/code> sea recursivo, ya que cada nodo puede contener otro nodo de la lista.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-rc-lt-t-gt-y-arc-lt-t-gt\"><code>Rc&lt;T&gt;<\/code> y <code>Arc&lt;T&gt;<\/code><\/h3>\n\n\n\n<p><code>Rc&lt;T&gt;<\/code> es un contador de referencias que permite que m\u00faltiples partes de tu programa compartan el mismo dato en el heap sin necesidad de clonarlo. <code>Arc&lt;T&gt;<\/code> es similar, pero es seguro para su uso en m\u00faltiples hilos (concurrencia), utilizando un contador de referencia at\u00f3mico.<\/p>\n\n\n\n<p><strong>Evitar ciclos de referencia con <code>Weak&lt;T&gt;<\/code><\/strong>:<\/p>\n\n\n\n<p>Uno de los riesgos con <code>Rc&lt;T&gt;<\/code> es crear ciclos de referencia, donde dos o m\u00e1s <code>Rc&lt;T&gt;<\/code> apuntan entre s\u00ed, impidiendo que Rust libere la memoria porque el conteo de referencias nunca llega a cero. Para evitar esto, puedes usar <code>Weak&lt;T&gt;<\/code>.<\/p>\n\n\n\n<p><code>Weak&lt;T&gt;<\/code> es un tipo de referencia que no incrementa el contador de referencias, lo que significa que no garantiza que el dato siga existiendo cuando se intenta acceder a \u00e9l. Esto permite romper ciclos de referencia, permitiendo que Rust libere la memoria adecuadamente.<\/p>\n\n\n\n<p><strong>Ejemplo Explicado:<\/strong><\/p>\n\n\n\n<p>Imaginemos un ejemplo con un \u00e1rbol de nodos donde cada nodo puede tener un padre y m\u00faltiples hijos. Si usamos <code>Rc&lt;T&gt;<\/code> para ambos, padres e hijos podr\u00edan formar un ciclo de referencia. Para evitar esto, usamos <code>Weak&lt;T&gt;<\/code> para las referencias al padre.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Rust\" data-shcb-language-slug=\"rust\"><span><code class=\"hljs language-rust\"><span class=\"hljs-keyword\">use<\/span> std::rc::{Rc, Weak};\n<span class=\"hljs-keyword\">use<\/span> std::cell::RefCell;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">Node<\/span><\/span> {\n    value: <span class=\"hljs-built_in\">i32<\/span>,\n    parent: RefCell&lt;Weak&lt;Node&gt;&gt;,  <span class=\"hljs-comment\">\/\/ Usamos Weak para evitar un ciclo de referencia<\/span>\n    children: RefCell&lt;<span class=\"hljs-built_in\">Vec<\/span>&lt;Rc&lt;Node&gt;&gt;&gt;,\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">fn<\/span> <span class=\"hljs-title\">main<\/span><\/span>() {\n    <span class=\"hljs-comment\">\/\/ Creamos un nodo hijo<\/span>\n    <span class=\"hljs-keyword\">let<\/span> leaf = Rc::new(Node {\n        value: <span class=\"hljs-number\">3<\/span>,\n        parent: RefCell::new(Weak::new()), <span class=\"hljs-comment\">\/\/ Inicialmente sin padre<\/span>\n        children: RefCell::new(<span class=\"hljs-built_in\">vec!<\/span>&#91;]),\n    });\n\n    <span class=\"hljs-comment\">\/\/ Creamos un nodo padre<\/span>\n    <span class=\"hljs-keyword\">let<\/span> branch = Rc::new(Node {\n        value: <span class=\"hljs-number\">5<\/span>,\n        parent: RefCell::new(Weak::new()), <span class=\"hljs-comment\">\/\/ Inicialmente sin padre<\/span>\n        children: RefCell::new(<span class=\"hljs-built_in\">vec!<\/span>&#91;Rc::clone(&amp;leaf)]), <span class=\"hljs-comment\">\/\/ El hijo apunta al padre<\/span>\n    });\n\n    <span class=\"hljs-comment\">\/\/ Establecemos la relaci\u00f3n de padre-hijo<\/span>\n    *leaf.parent.borrow_mut() = Rc::downgrade(&amp;branch);\n\n    <span class=\"hljs-comment\">\/\/ Aqu\u00ed, `leaf` tiene una referencia d\u00e9bil (`Weak`) al `branch`,<\/span>\n    <span class=\"hljs-comment\">\/\/ por lo que no se crea un ciclo de referencia.<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Rust<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">rust<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>En este ejemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>Rc&lt;Node&gt;<\/code><\/strong>: Se usa para las referencias a los hijos, lo que permite m\u00faltiples propietarios.<\/li>\n\n\n\n<li><strong><code>Weak&lt;Node&gt;<\/code><\/strong>: Se usa para las referencias al padre. Esto evita un ciclo de referencia porque <code>Weak&lt;Node&gt;<\/code> no incrementa el contador de referencias. Si el <code>Rc&lt;Node&gt;<\/code> que representa al padre es liberado, la referencia d\u00e9bil simplemente se convierte en <code>None<\/code>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-refcell-lt-t-gt-y-cell-lt-t-gt\"><code>RefCell&lt;T&gt;<\/code> y <code>Cell&lt;T&gt;<\/code><\/h3>\n\n\n\n<p><code>RefCell&lt;T&gt;<\/code> y <code>Cell&lt;T&gt;<\/code> permiten la mutabilidad interna, permitiendo que se modifiquen los datos incluso si la estructura es inmutable. <code>Cell&lt;T&gt;<\/code> es m\u00e1s sencillo y se usa principalmente para tipos que implementan <code>Copy<\/code>, como enteros o booleanos, mientras que <code>RefCell&lt;T&gt;<\/code> es m\u00e1s flexible y permite manejar cualquier tipo de dato, pero realiza verificaciones en tiempo de ejecuci\u00f3n.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-cell-lt-t-gt\"><code>Cell&lt;T&gt;<\/code><\/h4>\n\n\n\n<p><code>Cell&lt;T&gt;<\/code> permite mutar valores que implementan el trait <code>Copy<\/code> incluso si la estructura que los contiene es inmutable. Esto es \u00fatil cuando necesitas modificar datos simples dentro de una estructura sin tener que hacer que toda la estructura sea mutable.<\/p>\n\n\n\n<p><strong>Ejemplo con <code>Cell&lt;T&gt;<\/code>:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">std<\/span>::<span class=\"hljs-title\">cell<\/span>::<span class=\"hljs-title\">Cell<\/span>;\n\nstruct MyStruct {\n    value: Cell&lt;i32&gt;, <span class=\"hljs-comment\">\/\/ Cell permite la mutabilidad interna<\/span>\n}\n\nfn main() {\n    let my_struct = MyStruct { value: Cell::new(<span class=\"hljs-number\">10<\/span>) };\n    my_struct.value.set(<span class=\"hljs-number\">20<\/span>); <span class=\"hljs-comment\">\/\/ Podemos mutar el valor aunque `my_struct` sea inmutable<\/span>\n    println!(<span class=\"hljs-string\">\"value = {}\"<\/span>, my_struct.value.get());\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>En este ejemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>Cell::new(10)<\/code><\/strong>: Inicializa el valor dentro de <code>Cell<\/code>.<\/li>\n\n\n\n<li><strong><code>set(20)<\/code><\/strong>: Cambia el valor de 10 a 20, incluso si <code>my_struct<\/code> es inmutable.<\/li>\n\n\n\n<li><strong><code>get()<\/code><\/strong>: Recupera el valor actual.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-refcell-lt-t-gt\"><code>RefCell&lt;T&gt;<\/code><\/h4>\n\n\n\n<p><code>RefCell&lt;T&gt;<\/code> es similar a <code>Cell&lt;T&gt;<\/code>, pero es m\u00e1s flexible y permite manejar tipos que no implementan <code>Copy<\/code>. <code>RefCell&lt;T&gt;<\/code> realiza verificaciones en tiempo de ejecuci\u00f3n para asegurarse de que las reglas de pr\u00e9stamos (borrowing rules) de Rust no se violen. Esto significa que solo puedes tener una referencia mutable o m\u00faltiples referencias inmutables en cualquier momento.<\/p>\n\n\n\n<p><strong>Ejemplo con <code>RefCell&lt;T&gt;<\/code>:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">std<\/span>::<span class=\"hljs-title\">cell<\/span>::<span class=\"hljs-title\">RefCell<\/span>;\n\nfn main() {\n    let x = RefCell::new(<span class=\"hljs-number\">5<\/span>);\n\n    <span class=\"hljs-comment\">\/\/ Puedes tomar prestado el valor de `RefCell` como mutable y modificarlo<\/span>\n    *x.borrow_mut() += <span class=\"hljs-number\">1<\/span>;\n\n    <span class=\"hljs-comment\">\/\/ Tambi\u00e9n puedes tomar prestado el valor de `RefCell` como inmutable<\/span>\n    println!(<span class=\"hljs-string\">\"x = {}\"<\/span>, x.borrow());\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>En este ejemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>borrow_mut()<\/code><\/strong>: Permite tomar prestado el valor de <code>RefCell<\/code> como mutable, lo que te permite modificarlo.<\/li>\n\n\n\n<li><strong><code>borrow()<\/code><\/strong>: Permite tomar prestado el valor de <code>RefCell<\/code> como inmutable para leerlo.<\/li>\n<\/ul>\n\n\n\n<p><strong>Errores Comunes con <code>RefCell&lt;T&gt;<\/code>:<\/strong><\/p>\n\n\n\n<p>Si intentas violar las reglas de pr\u00e9stamos de Rust (por ejemplo, tomando m\u00faltiples referencias mutables al mismo tiempo), <code>RefCell<\/code> lanzar\u00e1 un <code>panic<\/code> en tiempo de ejecuci\u00f3n, lo que es diferente a las referencias normales que son verificadas en tiempo de compilaci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-cow-lt-t-gt\"><code>Cow&lt;T&gt;<\/code><\/h3>\n\n\n\n<p><code>Cow<\/code> (Copy-On-Write) es un <em>smart pointer<\/em> que permite trabajar con datos que pueden ser compartidos de manera inmutable, pero que se copian solo si es necesario modificarlos.<\/p>\n\n\n\n<p><strong>Ejemplo con <code>Cow<\/code><\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">std<\/span>::<span class=\"hljs-title\">borrow<\/span>::<span class=\"hljs-title\">Cow<\/span>;\n\nfn modify_string(s: &amp;str) -&gt; Cow&lt;str&gt; {\n    <span class=\"hljs-keyword\">if<\/span> s.contains(<span class=\"hljs-string\">\"Rust\"<\/span>) {\n        Cow::Borrowed(s)\n    } <span class=\"hljs-keyword\">else<\/span> {\n        let mut owned = s.to_owned();\n        owned.push_str(<span class=\"hljs-string\">\" with Rust\"<\/span>);\n        Cow::Owned(owned)\n    }\n}\n\nfn main() {\n    let original = <span class=\"hljs-string\">\"I love programming\"<\/span>;\n    let modified = modify_string(original);\n    println!(<span class=\"hljs-string\">\"{}\"<\/span>, modified);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>En este ejemplo, <code>Cow<\/code> evita realizar copias innecesarias, lo que puede mejorar la eficiencia de tu programa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-comparacion-de-smart-pointers\">Comparaci\u00f3n de Smart Pointers<\/h3>\n\n\n\n<p>Para ayudarte a decidir cu\u00e1l usar en cada situaci\u00f3n, aqu\u00ed tienes una tabla comparativa de los <em>smart pointers<\/em> discutidos:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Smart Pointer<\/th><th>Propiedad<\/th><th>Mutabilidad<\/th><th>Seguro en Hilos<\/th><th>Uso Com\u00fan<\/th><\/tr><\/thead><tbody><tr><td><code>Box&lt;T&gt;<\/code><\/td><td>Exclusiva<\/td><td>Inmutable\/Mutable<\/td><td>No<\/td><td>Estructuras recursivas<\/td><\/tr><tr><td><code>Rc&lt;T&gt;<\/code><\/td><td>Compartida<\/td><td>Inmutable<\/td><td>No<\/td><td>Compartir datos inmutables<\/td><\/tr><tr><td><code>Arc&lt;T&gt;<\/code><\/td><td>Compartida<\/td><td>Inmutable<\/td><td>S\u00ed<\/td><td>Compartir datos inmutables en hilos<\/td><\/tr><tr><td><code>RefCell&lt;T&gt;<\/code><\/td><td>Exclusiva<\/td><td>Mutable (runtime)<\/td><td>No<\/td><td>Mutabilidad interna<\/td><\/tr><tr><td><code>Cell&lt;T&gt;<\/code><\/td><td>Exclusiva<\/td><td>Mutable (runtime)<\/td><td>No<\/td><td>Mutabilidad interna para tipos <code>Copy<\/code><\/td><\/tr><tr><td><code>Cow&lt;T&gt;<\/code><\/td><td>Compartida<\/td><td>Condicional (Copy-On-Write)<\/td><td>No<\/td><td>Evitar copias innecesarias<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-por-que-los-smart-pointers-son-importantes\">\u00bfPor Qu\u00e9 los Smart Pointers Son Importantes?<\/h2>\n\n\n\n<p>Los <em>smart pointers<\/em> en Rust te permiten manejar la memoria de manera m\u00e1s flexible y segura, combinando lo mejor de los punteros tradicionales con caracter\u00edsticas avanzadas de gesti\u00f3n autom\u00e1tica de recursos. Estos son particularmente importantes en situaciones donde:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Necesitas Compartir Datos<\/strong>: Como con <code>Rc&lt;T&gt;<\/code> o <code>Arc&lt;T&gt;<\/code>, que te permiten compartir datos entre diferentes partes de tu programa sin necesidad de clonarlos innecesariamente.<\/li>\n\n\n\n<li><strong>Trabajas con Estructuras Recursivas<\/strong>: <code>Box&lt;T&gt;<\/code> es esencial para manejar estructuras recursivas donde el tama\u00f1o no puede ser conocido en tiempo de compilaci\u00f3n.<\/li>\n\n\n\n<li><strong>Quieres Optimizar el Uso de Recursos<\/strong>: <code>Cow&lt;T&gt;<\/code> te permite evitar copias innecesarias de datos hasta que realmente necesitas modificar esos datos.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-preguntas-frecuentes-y-errores-comunes\">Preguntas Frecuentes y Errores Comunes<\/h3>\n\n\n\n<p><strong>1. \u00bfCu\u00e1ndo usar <code>Box&lt;T&gt;<\/code> vs <code>Rc&lt;T&gt;<\/code>?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Usa <code>Box&lt;T&gt;<\/code> cuando necesitas una propiedad exclusiva y quieres almacenar datos en el heap, como en el caso de estructuras recursivas.<\/li>\n\n\n\n<li>Usa <code>Rc&lt;T&gt;<\/code> cuando necesitas compartir datos inmutables entre varias partes de tu programa.<\/li>\n<\/ul>\n\n\n\n<p><strong>2. \u00bfC\u00f3mo evitar ciclos de referencia con <code>Rc&lt;T&gt;<\/code>?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Usa <code>Weak&lt;T&gt;<\/code> para evitar que dos o m\u00e1s <code>Rc&lt;T&gt;<\/code> se apunten mutuamente, lo que evitar\u00e1 que Rust pueda liberar la memoria.<\/li>\n<\/ul>\n\n\n\n<p><strong>3. \u00bfPor qu\u00e9 recibo un error cuando intento mutar un <code>Rc&lt;T&gt;<\/code>?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Rc&lt;T&gt;<\/code> no permite mutabilidad. Si necesitas mutar los datos, considera usar <code>RefCell&lt;T&gt;<\/code> junto con <code>Rc&lt;T&gt;<\/code> para permitir la mutabilidad interna.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conectando-los-puntos-ownership-lifetimes-y-smart-pointers\">Conectando los Puntos: Ownership, Lifetimes, y Smart Pointers<\/h2>\n\n\n\n<p>Los <em>smart pointers<\/em> son una extensi\u00f3n natural de los conceptos de Ownership y Lifetimes en Rust. Mientras que Ownership te ayuda a gestionar qui\u00e9n tiene control sobre los datos, y Lifetimes aseguran que las referencias sean v\u00e1lidas durante su uso, los <em>smart pointers<\/em> te proporcionan herramientas adicionales para manejar la memoria y otros recursos de manera eficiente y segura.<\/p>\n\n\n\n<p>Si a\u00fan no has le\u00eddo mi art\u00edculo sobre <a href=\"https:\/\/www.ascinfo.dev\/blog\/ownership-en-rust\">Ownership en Rust<\/a>, te recomiendo que lo hagas, ya que es la base sobre la cual se construyen tanto los lifetimes como los <em>smart pointers<\/em>. Y no te olvides de estar atento al blog de <a href=\"https:\/\/leanmind.es\/es\/blog\/\">LeanMind<\/a>, donde pronto estar\u00e1 disponible un art\u00edculo relacionado sobre Lifetimes en Rust.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En mi art\u00edculo anterior sobre Ownership, exploramos c\u00f3mo Rust maneja la propiedad de los datos de manera segura, permiti\u00e9ndonos evitar muchos de los errores comunes relacionados con la memoria en otros lenguajes. Este es el pilar fundamental que hace que Rust sea tan poderoso. Ahora, es momento de profundizar en un concepto relacionado: los smart&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/\">Read more<\/a><\/p>\n","protected":false},"author":262,"featured_media":29478,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10608,10648],"tags":[10747],"collections":[],"class_list":{"0":"post-29467","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-arquitectura-del-software","8":"category-lenguajes-de-programacion","9":"tag-desarrollo-web","10":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Navegando por los Smart Pointers en Rust - Codemotion Magazine<\/title>\n<meta name=\"description\" content=\"Explora en profundidad los smart pointers en Rust, c\u00f3mo gestionan la memoria y recursos de manera eficiente, y su relaci\u00f3n con el ownership y los lifetimes en Rust. Aprende sobre Box, Rc, Arc, RefCell, Cell, y Cow a trav\u00e9s de ejemplos pr\u00e1cticos.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Navegando por los Smart Pointers en Rust\" \/>\n<meta property=\"og:description\" content=\"Explora en profundidad los smart pointers en Rust, c\u00f3mo gestionan la memoria y recursos de manera eficiente, y su relaci\u00f3n con el ownership y los lifetimes en Rust. Aprende sobre Box, Rc, Arc, RefCell, Cell, y Cow a trav\u00e9s de ejemplos pr\u00e1cticos.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-09-03T13:15:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-03T13:15:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1707\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Aitor Santana\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@aitorsci\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Aitor Santana\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/navegando-por-los-smart-pointers-en-rust\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/navegando-por-los-smart-pointers-en-rust\\\/\"},\"author\":{\"name\":\"Aitor Santana\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/03f6e4465d8f834a4f69a362d4a030df\"},\"headline\":\"Navegando por los Smart Pointers en Rust\",\"datePublished\":\"2024-09-03T13:15:26+00:00\",\"dateModified\":\"2024-09-03T13:15:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/navegando-por-los-smart-pointers-en-rust\\\/\"},\"wordCount\":1238,\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/navegando-por-los-smart-pointers-en-rust\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/4498903-1-scaled.jpg\",\"keywords\":[\"Desarrollo web\"],\"articleSection\":[\"Arquitectura del software\",\"Lenguajes de programaci\u00f3n\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/navegando-por-los-smart-pointers-en-rust\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/navegando-por-los-smart-pointers-en-rust\\\/\",\"name\":\"Navegando por los Smart Pointers en Rust - Codemotion Magazine\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/navegando-por-los-smart-pointers-en-rust\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/navegando-por-los-smart-pointers-en-rust\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/4498903-1-scaled.jpg\",\"datePublished\":\"2024-09-03T13:15:26+00:00\",\"dateModified\":\"2024-09-03T13:15:28+00:00\",\"description\":\"Explora en profundidad los smart pointers en Rust, c\u00f3mo gestionan la memoria y recursos de manera eficiente, y su relaci\u00f3n con el ownership y los lifetimes en Rust. Aprende sobre Box, Rc, Arc, RefCell, Cell, y Cow a trav\u00e9s de ejemplos pr\u00e1cticos.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/navegando-por-los-smart-pointers-en-rust\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/navegando-por-los-smart-pointers-en-rust\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/navegando-por-los-smart-pointers-en-rust\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/4498903-1-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/4498903-1-scaled.jpg\",\"width\":2560,\"height\":1707},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/navegando-por-los-smart-pointers-en-rust\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Lenguajes de programaci\u00f3n\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Navegando por los Smart Pointers en Rust\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Codemotion.Italy\\\/\",\"https:\\\/\\\/x.com\\\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/03f6e4465d8f834a4f69a362d4a030df\",\"name\":\"Aitor Santana\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/91630630833-100x100.png\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/91630630833-100x100.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/91630630833-100x100.png\",\"caption\":\"Aitor Santana\"},\"description\":\"Software Crafter | Software Developer in LeanMind. I focus on writing clean and maintainable code. To achieve this, I use techniques such as TDD, sustainable code, design patterns, or clean architectures.\",\"sameAs\":[\"https:\\\/\\\/ascinfo.dev\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/aitorscinfo\",\"https:\\\/\\\/x.com\\\/aitorsci\"],\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/author\\\/sstark97\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Navegando por los Smart Pointers en Rust - Codemotion Magazine","description":"Explora en profundidad los smart pointers en Rust, c\u00f3mo gestionan la memoria y recursos de manera eficiente, y su relaci\u00f3n con el ownership y los lifetimes en Rust. Aprende sobre Box, Rc, Arc, RefCell, Cell, y Cow a trav\u00e9s de ejemplos pr\u00e1cticos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/","og_locale":"en_US","og_type":"article","og_title":"Navegando por los Smart Pointers en Rust","og_description":"Explora en profundidad los smart pointers en Rust, c\u00f3mo gestionan la memoria y recursos de manera eficiente, y su relaci\u00f3n con el ownership y los lifetimes en Rust. Aprende sobre Box, Rc, Arc, RefCell, Cell, y Cow a trav\u00e9s de ejemplos pr\u00e1cticos.","og_url":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2024-09-03T13:15:26+00:00","article_modified_time":"2024-09-03T13:15:28+00:00","og_image":[{"width":2560,"height":1707,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-scaled.jpg","type":"image\/jpeg"}],"author":"Aitor Santana","twitter_card":"summary_large_image","twitter_creator":"@aitorsci","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Aitor Santana","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/"},"author":{"name":"Aitor Santana","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/03f6e4465d8f834a4f69a362d4a030df"},"headline":"Navegando por los Smart Pointers en Rust","datePublished":"2024-09-03T13:15:26+00:00","dateModified":"2024-09-03T13:15:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/"},"wordCount":1238,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-scaled.jpg","keywords":["Desarrollo web"],"articleSection":["Arquitectura del software","Lenguajes de programaci\u00f3n"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/","url":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/","name":"Navegando por los Smart Pointers en Rust - Codemotion Magazine","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-scaled.jpg","datePublished":"2024-09-03T13:15:26+00:00","dateModified":"2024-09-03T13:15:28+00:00","description":"Explora en profundidad los smart pointers en Rust, c\u00f3mo gestionan la memoria y recursos de manera eficiente, y su relaci\u00f3n con el ownership y los lifetimes en Rust. Aprende sobre Box, Rc, Arc, RefCell, Cell, y Cow a trav\u00e9s de ejemplos pr\u00e1cticos.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-scaled.jpg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-scaled.jpg","width":2560,"height":1707},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/navegando-por-los-smart-pointers-en-rust\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Lenguajes de programaci\u00f3n","item":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/"},{"@type":"ListItem","position":3,"name":"Navegando por los Smart Pointers en Rust"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/03f6e4465d8f834a4f69a362d4a030df","name":"Aitor Santana","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/10\/91630630833-100x100.png","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/10\/91630630833-100x100.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/10\/91630630833-100x100.png","caption":"Aitor Santana"},"description":"Software Crafter | Software Developer in LeanMind. I focus on writing clean and maintainable code. To achieve this, I use techniques such as TDD, sustainable code, design patterns, or clean architectures.","sameAs":["https:\/\/ascinfo.dev","https:\/\/www.linkedin.com\/in\/aitorscinfo","https:\/\/x.com\/aitorsci"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/sstark97\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-600x400.jpg","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-600x600.jpg","author_info":{"display_name":"Aitor Santana","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/sstark97\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-scaled.jpg",2560,1707,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-150x150.jpg",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-300x200.jpg",300,200,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-768x512.jpg",768,512,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-1024x683.jpg",1024,683,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-1536x1024.jpg",1536,1024,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-2048x1365.jpg",2048,1365,true],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-100x100.jpg",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-180x128.jpg",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-896x504.jpg",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-400x225.jpg",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-600x400.jpg",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/09\/4498903-1-600x600.jpg",600,600,true]},"uagb_author_info":{"display_name":"Aitor Santana","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/sstark97\/"},"uagb_comment_info":0,"uagb_excerpt":"En mi art\u00edculo anterior sobre Ownership, exploramos c\u00f3mo Rust maneja la propiedad de los datos de manera segura, permiti\u00e9ndonos evitar muchos de los errores comunes relacionados con la memoria en otros lenguajes. Este es el pilar fundamental que hace que Rust sea tan poderoso. Ahora, es momento de profundizar en un concepto relacionado: los smart&#8230;&hellip;","lang":"es","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/29467","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/262"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=29467"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/29467\/revisions"}],"predecessor-version":[{"id":29476,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/29467\/revisions\/29476"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/29478"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=29467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=29467"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=29467"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=29467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}