モジュールのレッスン (1/2)
存続期間と参照
Rust では、すべての参照には ライフタイム があり、これはその参照が有効なスコープに対応します。ほとんどの場合、ライフタイムは暗黙的に行われ、ライフタイム省略ルールのおかげでコンパイラによって推論されます。ただし、異なる参照の存続期間間の関係があいまいな場合は、それらに明示的に注釈を付ける必要があります。
ライフタイムの主な目的は、ダングリング参照 (すでにメモリから割り当てが解除されているデータへの参照) を防ぐことです。
ライフタイムアノテーションの構文
ライフタイム名はアポストロフィ (') で始まり、通常は短い小文字 ('a など) です。有効期間アノテーションは変数の実際の有効期間を変更しませんが、入力と出力の有効性の間の関係をコンパイラに示します。
たとえば、関数が 2 つの文字列参照パラメータを受け取り、文字列参照を返し、両方の入力パラメータが有効である限り、返された参照を有効にしたい場合は、次のように使用します。
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}データ構造の存続期間
構造体に参照であるフィールドが含まれている場合は、その参照の有効期間に明示的に注釈を付けて、構造体インスタンスが参照するデータよりも存続できないようにする必要があります。
struct ImportantExcerpt<'a> {
part: &'a str,
}
fn main() {
let novel = String::from("Call me Ishmael. Some years ago...");
let first_sentence = novel.split('.').next().unwrap();
let i = ImportantExcerpt {
part: first_sentence,
};
}静的寿命
'static ライフタイムは、プログラムの期間全体にわたって続く特別なライフタイムです。すべての文字列リテラル (&str) は、バイナリ実行可能ファイル内に直接保存されるため、暗黙的に 'static の有効期間を持ちます。
let s: &'static str = "I have a static lifetime.";自分で試してみてください
演習 1: 最長の関数
&'a str 型の x と &'a str 型の y の 2 つのパラメータを受け入れ、&'a str 型の値を返す、longest<'a> という名前の関数を作成します。関数内で if/else ブロックを使用して、長さが y より大きい場合は x を返し、それ以外の場合は y を返します。
ヒントを表示
`fn longest<'a>(x: &'a str, y: &'a str) -> &'a str` で署名を宣言します。次に、「if x.len() > y.len() { x } else { y }」を使用します。
3 回の試行後に解決策が利用可能になります
演習 2: 参照のある構造体
&'a str 型の部分という名前の単一フィールドを含む Excerpt<'a> という名前の構造体を定義します。 main 関数で、text という名前の文字列変数を作成し、text への参照を借用して Excerpt 型の変数抜粋をインスタンス化します。抜粋部分を印刷します。
ヒントを表示
`struct Excerpt<'a> {part: &'a str }`を使用します。 main では`Excerpt {part:&text }` でインスタンス化します。
3 回の試行後に解決策が利用可能になります
演習 3: 静的参照
静的有効期間 (&'static str) の明示的な型アノテーションを使用して message という名前の変数を宣言し、それに文字列リテラルを割り当てます。メッセージの値を出力します。
ヒントを表示
構文 `let message: &'static str = 'Messaggio statico!';` を使用して、静的有効期間に明示的に注釈を付けます。
3 回の試行後に解決策が利用可能になります