メンバーが構造体に所有されるようにします。簡単な質問で申し訳ありませんが、例を見つけることができませんでした。構造体の正しい宣言とインスタンス化の例を探しています。
文字列を構造体が所有する必要がある場合は、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
値は借用したフォームを自動的に逆参照するため、&*val
のval
型はCow<'a, str>
で、&str
が生成されます。