es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo pasar una cadena prestada a un Vec en Rust de ámbito exterior?

Estoy intentando aprender Rust de manera práctica mientras leo el libro. Mi programa intenta leer SPDisplaysDataType de macOS y me gustaría estructurar de alguna manera la salida de este comando (todavía no tengo idea de cómo lograr esto, cualquier idea sería bienvenida).

Ahora mismo, no puedo compilar debido a este error de préstamo que no puedo resolver.

use std::process::Command;

fn main() {
    let output = Command::new("system_profiler")
        .arg("SPDisplaysDataType")
        .output()
        .expect("Fallo al obtener los datos de la pantalla");

    let display_text = String::from_utf8(output.stdout)
        .expect("No se puede leer la cadena de salida");

    let mut gpus: Vec<vec<&str>> = Vec::new();
    let mut gpu_structure: Vec<&str> = Vec::new();

    for (index, line) in display_text.lines().enumerate() {

        if line.contains("Chipset Model") {
            gpus.push(gpu_structure.clone());

            gpu_structure = Vec::new();
            let mut gpu_title_string = format!("{} ", index);

            gpu_title_string.push_str(line);

            let cloned = gpu_title_string.clone();
            gpu_structure.push(cloned.as_str());
            continue;
        }
         gpu_structure.push(line);
    }
}

El error que obtengo es:

|
21 | gpus.push(gpu_structure.clone());
| ------------- el préstamo se utiliza después aquí
...
29 | gpu_structure.push(cloned.as_str());
| ^^^^^^ el valor prestado no vive lo suficiente
30 | continue;
31 | }
| - `cloned` se libera aquí mientras todavía se usa el préstamo
</vec<&str>

Tags:  ,

Answer

  1. Avatar for davy.ai

    El error de préstamo que está obteniendo es probablemente debido al hecho de que está tratando de empujar un valor prestado cloned.as_str() en gpu_structure, pero el comprobador de préstamos de Rust le está indicando que cloned no vive lo suficiente dentro del bucle.

    Una forma de solucionar esto es en su lugar empujar el valor propiedad String en gpu_structure. Puede hacer esto cambiando la línea:

    gpu_structure.push(cloned.as_str());
    

    a:

    gpu_structure.push(cloned);
    

    De esta manera, el valor String es propiedad de gpu_structure y no reside en la pila con una vida útil limitada.

    Además, es posible que desee asegurarse de que gpu_structure se empuje en gpus al final del bucle para capturar el último conjunto de datos de la GPU. Puede agregar este código justo antes del final del bucle (después de la declaración continue):

    if index == display_text.lines().count() - 1 {
        gpus.push(gpu_structure.clone());
    }
    

    Esto asegurará que el último conjunto de datos de la GPU también se recopile y almacene en gpus.

    ¡Espero que esto ayude! Avíseme si tiene más preguntas.

Comments are closed.