2014-09-09 13 views
30

Come creare una struttura con membri stringa? I membri dovrebbero essere di proprietà di struct object. Sono nuovo di ruggine, mi dispiace per la semplice domanda, ma non sono riuscito a trovare un esempio. C'era un esempio obsoleto con "~" che sembra essere deprecato ... Sto cercando la corretta dichiarazione di struct e quindi l'esempio di istanza.Rust: come creare una struct con i membri della stringa?

+0

Utilizzare 'String' e tenere presente che la creazione di un' String' da '& str' tramite' .to_string() 'implica un'allocazione dell'heap + copiando l'intera stringa. – sellibitze

risposta

59

Se la stringa deve essere di proprietà della struttura, è necessario utilizzare String. In alternativa, è possibile utilizzare &str con una durata statica (ad esempio, la durata del programma). Per esempio:

struct Foo { 
    bar: String, 
    baz: &'static str, 
} 

fn main() { 
    let foo = Foo { 
     bar: "bar".to_string(), 
     baz: "baz", 
    }; 
    println!("{}, {}", foo.bar, foo.baz); 
} 

Se la durata della stringa è sconosciuto, allora è possibile parametrizzare Foo con una vita:

struct Foo<'a> { 
    baz: &'a str, 
} 

E se non siete sicuri se la stringa saranno di proprietà o no (utile per evitare assegnazioni), quindi è possibile utilizzare borrow::Cow:

use std::borrow::Cow; 

struct Foo<'a> { 
    baz: Cow<'a, str>, 
} 

fn main() { 
    let foo1 = Foo { baz: Cow::Borrowed("baz") }; 
    let foo2 = Foo { baz: Cow::Owned("baz".to_string()) }; 
    println!("{}, {}", foo1.baz, foo2.baz); 
} 

Nota che il tipo Cow è ov parametrizzato er una vita. La durata si riferisce alla durata della stringa presa in prestito (ad esempio, quando è un Borrowed). Se si dispone di un Cow, è possibile utilizzare borrow e ottenere uno &'a str, con il quale è possibile eseguire le normali operazioni con le stringhe senza preoccuparsi di allocare una nuova stringa o meno. (In genere, esplicita chiamata di borrow non è necessaria a causa di deref. Vale a dire, Cow valori saranno Deref alla loro forma in prestito automaticamente. Così &*val dove val ha digitare Cow<'a, str> produrrà un &str.)

La sintassi ~ è infatti deprecato . La sostituzione di ~str è String, che si può pensare come un buffer di stringa (ad esempio, il contenuto della stringa è modificabile ed è espandibile). A &str è una vista immutabile di una stringa che non può essere modificata nel codice di sicurezza.

+3

Uhhh, grazie per la risposta completa. Devo pensare alla parametrizzazione per tutta la vita un altro giorno :) – vladimir

Problemi correlati