web-dev-qa-db-ja.com

文字列メンバーを持つRust構造体を作成するには?

メンバーが構造体に所有されるようにします。簡単な質問で申し訳ありませんが、例を見つけることができませんでした。構造体の正しい宣言とインスタンス化の例を探しています。

44
vladimir

文字列を構造体が所有する必要がある場合は、Stringを使用する必要があります。または、静的な有効期間(つまり、プログラムの有効期間)で&strを使用することもできます。例えば:

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

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

文字列のライフタイムが不明な場合、Fooをライフタイムでパラメータ化できます。

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

こちらもご覧ください:

文字列が所有されるかどうかわからない場合(割り当てを回避するのに便利)、 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);
}

Cowタイプは、存続期間にわたってパラメーター化されることに注意してください。ライフタイムは、borrowed文字列のライフタイムを指します(つまり、Borrowedの場合)。 Cowがある場合は、borrowを使用して&'a strを取得できます。これにより、新しい文字列を割り当てるかどうかを心配せずに通常の文字列操作を実行できます。通常、deref強制のため、borrowを明示的に呼び出す必要はありません。つまり、Cow値は借用したフォームを自動的に逆参照するため、&*valval型はCow<'a, str>で、&strが生成されます。

79
BurntSushi5