Ownership y borrowing

Rust Smart Pointers: Box and Rc

Put data on the heap with Box and share one value between several owners with Rc.

  • Intermedio
  • 3 min de lectura
  • 1 ejemplo ejecutable
Lo que aprenderás
  • Box<T> for recursive types
  • Rc<T> for shared ownership
  • Rc::strong_count
A list built with Box
  1. 1Node(1)points to
  2. 2Node(2)points to
  3. 3Node(3)points to
  4. 4Endsum = 6

Pointers that own their data

A smart pointer owns the data it points to. Box<T> stores a value on the heap, which makes recursive types possible. Rc<T> lets several owners share one value by counting them.

List contains itself, so its size would be infinite without Box: a Box has a fixed size because it is only a pointer. Rc::clone does not copy the string, it adds an owner, and strong_count shows three owners. The value is freed when the last owner is gone.

Puntos clave

  1. Box has a fixed size, so a type can contain itself.
  2. Rc::clone adds an owner, it does not copy the data.
  3. The value is freed when the last owner is gone.

Ejemplo ejecutable de Rust

Rust
Ejecutar código →
main.rs
use std::rc::Rc;

enum List {
    Node(i32, Box<List>),
    End,
}

fn sum(list: &List) -> i32 {
    match list {
        List::Node(value, next) => value + sum(next),
        List::End => 0,
    }
}

fn main() {
    let list = List::Node(1, Box::new(List::Node(2, Box::new(List::Node(3, Box::new(List::End))))));
    println!("sum = {}", sum(&list));

    let shared = Rc::new(String::from("shared config"));
    let reader_a = Rc::clone(&shared);
    let reader_b = Rc::clone(&shared);
    println!("{reader_a} / {reader_b}");
    println!("owners: {}", Rc::strong_count(&shared));
}
Obtén un botón Run para este ejemplo Resultado de ejecutar el código
sum = 6
shared config / shared config
owners: 3

Practica

Abre el ejemplo en el compilador online, cambia un valor o añade una línea y predice la salida antes de ejecutarlo. Después rompe el código a propósito y lee el mensaje del compilador.

¿Terminaste esta lección?

Márcala como aprendida para seguir tu progreso.

Practica con un reto

Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.

Todos los retos