2015-09-01 13 views
5

Attualmente sto facendo il seguente:Come posso decomprimere (destrutturare) elementi da un vettore?

let line_parts = line.split_whitespace().take(3).collect::<Vec<&str>>(); 
let ip = line_parts[0]; 
let bytes = line_parts[1]; 
let int_number = line_parts[2]; 

E 'possibile fare qualcosa del genere?

let [ip, bytes, int_number] = line.split_whitespace().take(3).collect(); 

Sono notati vari riferimenti a vettore destrutturazione su alcuni siti, ma la documentazione ufficiale non sembrano parlare di esso.

+1

Si noti che il titolo non corrisponde al codice di esempio. Dopo 'collect' hai un' Vec', non un iteratore, quindi stai davvero chiedendo come decomprimere un 'Vec'; sarebbe meglio correggere il titolo. –

+0

Personalmente userò 'let mut parti = line.split_whitespace();' seguito da 'let (ip, byte, int_number) = (parts.next(). Unwrap(), parts.next(). Unwrap() , parts.next(). unwrap()); 'o più probabilmente' if let (Alcuni (ip), Alcuni (byte), Alcuni (int_number)) = (parts.next(), parts.next(), parti .Next()) '. –

risposta

5

Sembra quello che serve è "modelli slice":

#![feature(slice_patterns)] 

fn main() { 
    let line = "127.0.0.1 1000 what!?"; 
    let v = line.split_whitespace().take(3).collect::<Vec<&str>>(); 

    if let [ip, port, msg] = &v[..] { 
     println!("{}:{} says '{}'", ip, port, msg); 
    } 
} 

Nota la if let invece del semplice let. I modelli di slice sono confutabili, quindi è necessario tenerne conto (potrebbe essere necessario avere anche un ramo else).

Questo richiederà una versione notturna di Rust.

Problemi correlati