1. ホーム
  2. string

[解決済み] 文字列を含むRust構造体を作成するには?

2023-01-13 16:52:11

質問

メンバを構造体で所有させたい。素朴な質問で申し訳ないのですが、例が見つかりませんでした。構造体の正しい宣言とインスタンス化の例を探しています。

どのように解決するのですか?

文字列を構造体で所有する必要がある場合は 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 ). もし、あなたが Cow であれば borrow を取得し &'a str を得れば、新しい文字列を割り当てるかどうかを気にすることなく、 通常の文字列操作ができるようになります。一般に、明示的に borrow を明示的に呼び出すことは必要ありません。すなわち Cow の値は自動的に借用されたフォームにデリファレンスされるので &*val ここで val はタイプ Cow<'a, str> を生成します。 &str .