Firmas de funciones en Rust con tiempos de vida

RustRustBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, se nos presenta la firma de funciones con tiempos de vida en Rust, donde cualquier referencia debe tener un tiempo de vida anotado y cualquier referencia devuelta debe tener el mismo tiempo de vida que una entrada o ser static. Es importante destacar que no está permitido devolver referencias sin entrada si eso implicaría devolver referencias a datos no válidos. Los ejemplos proporcionados demuestran formas válidas de funciones con tiempos de vida, incluyendo funciones con una referencia de entrada, funciones con referencias mutables, funciones con múltiples elementos y diferentes tiempos de vida, y funciones que devuelven referencias que se han pasado como parámetros.

Nota: Si el laboratorio no especifica un nombre de archivo, puede usar cualquier nombre de archivo que desee. Por ejemplo, puede usar main.rs, compilar y ejecutarlo con rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/BasicConceptsGroup -.-> rust/mutable_variables("Mutable Variables") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") subgraph Lab Skills rust/variable_declarations -.-> lab-99205{{"Firmas de funciones en Rust con tiempos de vida"}} rust/mutable_variables -.-> lab-99205{{"Firmas de funciones en Rust con tiempos de vida"}} rust/integer_types -.-> lab-99205{{"Firmas de funciones en Rust con tiempos de vida"}} rust/string_type -.-> lab-99205{{"Firmas de funciones en Rust con tiempos de vida"}} rust/type_casting -.-> lab-99205{{"Firmas de funciones en Rust con tiempos de vida"}} rust/function_syntax -.-> lab-99205{{"Firmas de funciones en Rust con tiempos de vida"}} rust/expressions_statements -.-> lab-99205{{"Firmas de funciones en Rust con tiempos de vida"}} rust/method_syntax -.-> lab-99205{{"Firmas de funciones en Rust con tiempos de vida"}} end

Funciones

Ignorando la [elisión], las firmas de funciones con tiempos de vida tienen algunas restricciones:

  • cualquier referencia debe tener un tiempo de vida anotado.
  • cualquier referencia devuelta debe tener el mismo tiempo de vida que una entrada o ser static.

Además, tenga en cuenta que no está permitido devolver referencias sin entrada si eso implicaría devolver referencias a datos no válidos. El siguiente ejemplo muestra algunas formas válidas de funciones con tiempos de vida:

// Una referencia de entrada con tiempo de vida `'a` que debe existir
// al menos durante el tiempo que dure la función.
fn print_one<'a>(x: &'a i32) {
    println!("`print_one`: x es {}", x);
}

// También es posible tener referencias mutables con tiempos de vida.
fn add_one<'a>(x: &'a mut i32) {
    *x += 1;
}

// Varios elementos con diferentes tiempos de vida. En este caso,
// estaría bien que ambos tuvieran el mismo tiempo de vida `'a`, pero
// en casos más complejos, pueden ser necesarios tiempos de vida diferentes.
fn print_multi<'a, 'b>(x: &'a i32, y: &'b i32) {
    println!("`print_multi`: x es {}, y es {}", x, y);
}

// Es aceptable devolver referencias que se han pasado como parámetros.
// Sin embargo, se debe devolver el tiempo de vida correcto.
fn pass_x<'a, 'b>(x: &'a i32, _: &'b i32) -> &'a i32 { x }

//fn invalid_output<'a>() -> &'a String { &String::from("foo") }
// Lo anterior es inválido: `'a` debe existir más tiempo que la función.
// Aquí, `&String::from("foo")` crearía una `String`, seguida de una
// referencia. Luego, los datos se eliminan al salir del ámbito, dejando
// una referencia a datos no válidos para ser devuelta.

fn main() {
    let x = 7;
    let y = 9;

    print_one(&x);
    print_multi(&x, &y);

    let z = pass_x(&x, &y);
    print_one(z);

    let mut t = 3;
    add_one(&mut t);
    print_one(&t);
}

Resumen

¡Felicitaciones! Has completado el laboratorio de Funciones. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.