Derive Clone
El atributo #[derive] indica al compilador que genere automáticamente implementaciones de trait para un struct. Clone agrega un método .clone() que produce una copia profunda, mientras que Debug agrega .debug_str() para inspección legible por humanos.
Código
// #[derive(Clone, Debug)]: clonar structs y obtener representación debug
#[derive(Clone, Debug)]
struct Point {
x: int,
y: int
}
#[derive(Clone, Debug)]
struct Rectangle {
origin: int,
width: int,
height: int
}
fn main() -> int {
// Clonar un Point
let p1: Point = Point { x: 10, y: 20 }
let p2: Point = p1.clone()
print("Original: x=" + int_to_string(p1.x) + " y=" + int_to_string(p1.y))
print("Clon: x=" + int_to_string(p2.x) + " y=" + int_to_string(p2.y))
// Debug string
let ds: String = p1.debug_str()
print("Debug: " + ds)
// Clonar Rectangle
let r1: Rectangle = Rectangle { origin: 0, width: 100, height: 50 }
let r2: Rectangle = r1.clone()
print("Rect original: w=" + int_to_string(r1.width))
print("Rect clon: w=" + int_to_string(r2.width))
return 0
}
Salida
Original: x=10 y=20
Clon: x=10 y=20
Debug: Point { x: 10, y: 20 }
Rect original: w=100
Rect clon: w=100
Explicación
Colocar #[derive(Clone, Debug)] encima de la declaración de un struct le indica al compilador de Nyx que sintetice automáticamente las implementaciones de trait correspondientes. Obtenés un .clone() y un .debug_str() completamente funcionales sin escribir una sola línea de código de implementación. Esto elimina toda una categoría de código repetitivo.
Clone realiza una copia campo por campo del struct. Después de let p2 = p1.clone(), modificar p2 no afecta a p1 — cada uno mantiene su propia copia independiente de los datos. Esto es seguro incluso para structs que contienen campos alojados en el heap, porque la macro derive maneja la lógica de la copia profunda.
Debug genera un método .debug_str() que formatea el struct con el nombre de su tipo y los valores de sus campos en una forma legible — útil para logging, tests e inspección durante el desarrollo. Se pueden derivar múltiples traits en una sola anotación listándolos separados por comas dentro de los paréntesis.