¿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:
|
</vec<&str>
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
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()
engpu_structure
, pero el comprobador de préstamos de Rust le está indicando quecloned
no vive lo suficiente dentro del bucle.Una forma de solucionar esto es en su lugar empujar el valor propiedad
String
engpu_structure
. Puede hacer esto cambiando la línea:a:
De esta manera, el valor
String
es propiedad degpu_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 engpus
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óncontinue
):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.