2016-05-23 23 views
6

Devo convertire la variabile PathBuf in un String per alimentare la mia funzione. Il mio codice è simile a questo:Come convertire PathBuf in stringa

let cwd = env::current_dir().unwrap(); 
let my_str: String = cwd.as_os_str().to_str().unwrap().to_string(); 
println!("{:?}", my_str); 

funziona, ma è terribile con la cwd.as_os_str…. Avete un metodo più conveniente o qualche suggerimento su come gestirlo?

risposta

6

Non è semplice: String sono codificati in UTF-8, ma potrebbe non essere PathBuf (ad esempio in Windows). Quindi la conversione potrebbe fallire.

Ci sono anche i metodi to_str e per comodità. Il primo restituisce un Option<&str> per indicare possibili errori e il successivo avrà sempre successo ma sostituirà i caratteri non UTF-8 con U+FFFD REPLACEMENT CHARACTER (motivo per cui restituisce Cow<str>: se il percorso è già UTF-8 valido, restituirà un riferimento a il buffer interno, ma se alcuni caratteri devono essere sostituiti, assegnerà un nuovo String per quello, in entrambi i casi è quindi possibile utilizzare into_owned se è davvero necessario un String).

+0

Potresti aggiungere una breve spiegazione su "Mucca" e il suggerimento per usare "in_owned()'? O posso modificare la tua risposta per aggiungerla? –

+0

Grazie mille. @lukas kalbertodt, per l'uso di Cow, puoi fare riferimento a questo blog: http://hermanradtke.com/2015/05/29/creating-a-rust-function-that-returns-string-or-str.html – xiaoai

2

Come già detto mcarton non è così semplice e non tutti i percorsi sono codificati in UTF-8. Ma puoi usare:

p.into_os_string().into_string() 

Per avere un buon controllo di esso. Con ? è possibile inviare l'errore a livello superiore o semplicemente ignorarlo per unwrap():

let my_str = cwd.into_os_string().into_string().unwrap(); 

La cosa bellezza di into_string() è che l'errore avvolgere il valore originale OsString.

Problemi correlati