0Pricing
Learn Rust Coding · Lección

Despacho estático frente a dinámico

Ventajas y desventajas

Despacho estático frente a dinámico es una lección gratuita de Learn Rust Coding en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Learn Rust Coding, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Learn Rust Coding incluye 4 lecciones en total.

Dos formas de realizar el despacho

Cuando llama a un método de un trait, Rust debe decidir qué implementación concreta se ejecutará. Hay dos estrategias: despacho estático (decidido en tiempo de compilación) y despacho dinámico (decidido durante la ejecución).

Despacho estático con genéricos

Las funciones genéricas usan despacho estático. El compilador genera una copia especializada para cada tipo concreto, un proceso denominado monomorfización.

trait Area { fn area(&self) -> f64; }
struct Square { s: f64 }
impl Area for Square { fn area(&self) -> f64 { self.s * self.s } }

fn print_area<T: Area>(shape: &T) {
    println!("{}", shape.area());
}

fn main() {
    print_area(&Square { s: 4.0 });
}

Monomorfización

Para cada tipo con el que llama a la función, el compilador genera una versión específica. La llamada al método se convierte en una llamada directa sin búsquedas, por lo que es tan rápida como el código escrito manualmente.

Despacho dinámico con dyn

Los objetos de trait usan despacho dinámico. Una única función gestiona todos los tipos; la dirección del método se encuentra durante la ejecución mediante una vtable.

trait Area { fn area(&self) -> f64; }
struct Square { s: f64 }
impl Area for Square { fn area(&self) -> f64 { self.s * self.s } }

fn print_area(shape: &dyn Area) {
    println!("{}", shape.area());
}

fn main() {
    print_area(&Square { s: 4.0 });
}

La vtable

Un objeto de trait es un puntero grueso: una parte apunta a los datos y la otra a una vtable que enumera las direcciones de los métodos. Cada llamada busca una posición en esta tabla.

Esta indirección adicional es el coste durante la ejecución.

Equilibrio entre velocidad y flexibilidad

El despacho estático es más rápido en cada llamada y permite insertar código, pero genera más código máquina. El despacho dinámico añade una pequeña indirección, pero mantiene reducido el tamaño del código.

En la mayoría de las aplicaciones, la diferencia es insignificante; elija según la flexibilidad que necesite.

Equilibrio del tamaño del código

Llamar a una función genérica con muchos tipos crea muchas copias, lo que puede aumentar demasiado el binario. Una única función con dyn evita esa duplicación.

Por eso, a veces las bibliotecas prefieren usar objetos de trait internamente.

Equilibrio de la flexibilidad

Los genéricos imponen un tipo concreto por sitio de llamada, por lo que no pueden contener tipos mezclados en una colección. Los objetos de trait sí pueden. Si necesita una lista heterogénea, el despacho dinámico es la solución.

trait Area { fn area(&self) -> f64; }
struct Square { s: f64 }
struct Rect { w: f64, h: f64 }
impl Area for Square { fn area(&self) -> f64 { self.s * self.s } }
impl Area for Rect { fn area(&self) -> f64 { self.w * self.h } }

fn main() {
    let shapes: Vec<Box<dyn Area>> = vec![Box::new(Square { s: 2.0 }), Box::new(Rect { w: 3.0, h: 4.0 })];
    let total: f64 = shapes.iter().map(|s| s.area()).sum();
    println!("{}", total);
}

Combinar ambos

Puede combinarlos: una función genérica podría aceptar impl Trait en el límite y almacenar internamente los valores como Box<dyn Trait>. Use cada opción donde resulte adecuada.

Guía para decidir

Reglas rápidas:

  • ¿Un tipo por llamada y una ruta crítica? Use genéricos (estático).
  • ¿Tipos mezclados en una colección? Use dyn (dinámico).
  • ¿Le preocupa el tamaño del binario? Tienda a usar dyn.

Ambos tienen coste cero donde importa

Rust nunca añade sobrecarga que usted no haya solicitado. Los genéricos no tienen coste durante la ejecución; los objetos de trait solo cuestan una indirección de puntero. Usted elige explícitamente el equilibrio.

Comprobación rápida

Compruebe cuánto sabe sobre el despacho.

Resumen

Ha comparado los dos estilos de despacho:

  • Estático (genéricos): monomorfizado, rápido, binario más grande, un tipo por llamada
  • Dinámico (dyn): búsqueda en vtable, flexible, código más pequeño, permite colecciones mixtas
  • Elija según sus necesidades de flexibilidad, rendimiento y tamaño del binario

Preguntas frecuentes

¿La lección «Despacho estático frente a dinámico» es gratis?

Sí — el texto completo de «Despacho estático frente a dinámico» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Learn Rust Coding, actualiza a CoddyKit PRO. El curso de Learn Rust Coding incluye 4 lecciones en total.

¿Qué aprenderé en «Despacho estático frente a dinámico»?

Ventajas y desventajas Practicas Learn Rust Coding con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Learn Rust Coding?

No se requiere experiencia previa. Learn Rust Coding en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Despacho estático frente a dinámico»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Learn Rust Coding?

Sí. Cada lección de Learn Rust Coding incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Definición de traits
  2. Objetos trait y dyn
  3. Despacho estático frente a dinámico
  4. Métodos predeterminados
← Volver a Learn Rust Coding