En lugar de transferir la propiedad al llamar a una función, puede dejar que una función tome prestado el valor:
#[derive(Debug)]
struct Point(i32, i32);
fn add(p1: &Point, p2: &Point) -> Point {
Point(p1.0 + p2.0, p1.1 + p2.1)
}
fn main() {
let p1 = Point(3, 4);
let p2 = Point(10, 20);
let p3 = add(&p1, &p2);
println!("{p1:?} + {p2:?} = {p3:?}");
}
- La función de add toma prestados dos puntos y devuelve un nuevo punto.
- La persona que llama conserva la propiedad de las entradas.
- El compilador de Rust puede realizar la optimización del valor de retorno (RVO).
- En C++, la elisión de copia debe definirse en la especificación del lenguaje porque los constructores pueden tener efectos secundarios. En Rust, esto no es un problema en absoluto. Si RVO no sucedió, Rust siempre realizará una copia memcpy simple y eficiente.