web-dev-qa-db-fra.com

Comment créer une structure Rust avec des membres de chaîne?

Je veux que les membres appartiennent à la structure. Désolé pour la question simple, mais je n'ai pas pu trouver d'exemple. Je cherche la déclaration correcte d'une struct et des exemples d'instanciation.

44
vladimir

Si la chaîne doit appartenir à la structure, vous devez utiliser String. Vous pouvez également utiliser un &str avec une durée de vie statique (c'est-à-dire la durée de vie du programme). Par exemple:

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

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

Si la durée de vie de la chaîne est inconnue, vous pouvez paramétrer Foo avec une durée de vie:

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

Voir également:

Si vous n'êtes pas sûr que la chaîne appartiendra ou non (utile pour éviter les allocations), vous pouvez utiliser 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);
}

Notez que le type Cow est paramétré sur une durée de vie. La durée de vie fait référence à la durée de vie de la chaîne empruntée (c'est-à-dire lorsqu'elle est une Borrowed). Si vous avez un Cow, vous pouvez utiliser borrow et obtenir un &'a str, avec lequel vous pouvez effectuer des opérations de chaîne normales sans vous soucier d'allouer ou non une nouvelle chaîne. En règle générale, l'appel explicite de borrow n'est pas requis en raison de contraintes deref. À savoir, les valeurs de Cow seront automatiquement déférencées par rapport à leur forme empruntée, donc &*valval a le type Cow<'a, str> produira un &str.

79
BurntSushi5