2013-03-13 18 views
18

Questo è per lo 0,6 attuale tronco di ruggine, non è sicuro del commit esatto.Come si trasforma & str in ~ str in Rust?

Diciamo che voglio per ciascuna più stringhe, e la mia chiusura prende un argomento puntatore a stringa preso in prestito (& str). Voglio che la mia chiusura aggiunga il suo argomento a un vettore di proprietà di stringhe di proprietà ~ [~ str] da restituire. La mia comprensione di Rust è debole, ma penso che le stringhe siano un caso speciale in cui non puoi dereferenziarle con * giusto? Come faccio a ottenere le stringhe da & str nel metodo push del vettore che accetta un ~ str?

Ecco alcuni codice che non viene compilato

fn read_all_lines() -> ~[~str] { 
    let mut result = ~[]; 
    let reader = io::stdin(); 
    let util = @reader as @io::ReaderUtil; 
    for util.each_line |line| { 
     result.push(line); 
    } 
    result 
} 

Esso non viene compilato perché è inferire il tipo di risultato di essere [& str] dato che è quello che sto spingendo su di esso. Per non parlare della sua vita sarà sbagliata dal momento che aggiungo una variabile a vita breve ad esso.

Mi rendo conto che potrei usare il metodo read_line() di ReaderUtil che restituisce un ~ str. Ma questo è solo un esempio.

Quindi, come posso ottenere una stringa di proprietà da una stringa in prestito? O sono totalmente frainteso.

+0

Questo è meno rilevante la società dato che la ruggine è a 1. X. (Ruggine 1.X usa 'String' e' & str', non '~ str') Quindi, sarebbe utile etichettarlo come pre-Rust 1.0. La mia speranza è che la rilevanza del motore di ricerca possa essere adeguata di conseguenza. –

+0

Potrei essere fuori linea qui, ma ho votato per chiudere questa domanda in quanto non si applica alla sintassi Rust corrente, che non include ~ –

risposta

11

si dovrebbe chiamare il metodo del tratto StrSlice, to_owned, come in:

fn read_all_lines() -> ~[~str] { 
    let mut result = ~[]; 
    let reader = io::stdin(); 
    let util = @reader as @io::ReaderUtil; 
    for util.each_line |line| { 
     result.push(line.to_owned()); 
    } 
    result 
} 

StrSlice docs tratto sono qui:

http://static.rust-lang.org/doc/core/str.html#trait-strslice

4

Non è possibile.

Per uno, non funziona semanticamente: un ~str promette che solo una cosa lo possiede alla volta. Ma viene preso in prestito un &str, quindi cosa succede al luogo da cui hai preso in prestito? Non ha modo di sapere che stai cercando di sottrarre il suo unico riferimento, e sarebbe piuttosto scortese eliminare anche i dati del chiamante.

Per altro, non funziona logicamente: ~ -pointers e @ -pointers sono allocati completamente diversi cumuli, e una & non sa che mucchio, quindi non può essere convertita in ~ e garantire comunque che i dati sottostanti vadano nel posto giusto.

Quindi è possibile utilizzare read_line o fare una copia, che sono ... non del tutto sicuro di come fare :)

mi chiedo il motivo per cui l'API è come questo, quando & è il più limitato dei puntatori. ~ dovrebbe funzionare altrettanto bene qui; non è come se le stringhe iterate esistessero già da qualche altra parte e necessiti di da prendere in prestito.

+0

Grazie. Questo ha molto senso. – Ross

4

All'inizio ho pensato che fosse possibile utilizzare copy line per creare il puntatore proprietario dal puntatore preso in prestito alla stringa ma questo apparentemente copia il puntatore scavato.

Quindi ho trovato str::from_slice(s: &str) -> ~str. Questo è probabilmente ciò di cui hai bisogno.

+0

Ho provato anche "copia linea". Mi è sembrato strano che fornissero un modo per leggere tutte le righe, ma ti dà dei puntatori presi in prestito e non puoi copiarli. Sembra che str :: from_slice utilizzi una copia di byte non sicura non valida. – Ross

+1

Sì, esegue la copia della stringa. Proprio quello di cui hai bisogno per creare un puntatore proprietario. Non penso che importi se c'è una chiamata non sicura sotto la funzione se funziona come previsto. Ad ogni modo, abbiamo operazioni non sicure al livello più profondo. –

+4

Anche '.to_str()' dovrebbe funzionare. – brson

Problemi correlati