はじめに
この実験では、Rust における 'static
の概念について説明します。
注: 実験でファイル名が指定されていない場合、好きなファイル名を使用できます。たとえば、
main.rs
を使用して、rustc main.rs &&./main
でコンパイルして実行できます。
This tutorial is from open-source community. Access the source code
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、Rust における 'static
の概念について説明します。
注: 実験でファイル名が指定されていない場合、好きなファイル名を使用できます。たとえば、
main.rs
を使用して、rustc main.rs &&./main
でコンパイルして実行できます。
Rust にはいくつかの予約済みの寿命名があります。その 1 つが 'static
です。2 つの状況で遭遇するかもしれません。
// 'static 寿命を持つ参照:
let s: &'static str = "hello world";
// トレイト境界の一部としての 'static:
fn generic<T>(x: T) where T: 'static {}
どちらも関連していますが、微妙に異なり、これは Rust を学ぶ際の混乱の一般的な原因です。以下は、それぞれの状況の例です。
参照寿命としての 'static
は、参照によって指されるデータが実行中のプログラムの生存期間全体にわたって存在することを示します。それでも、短い寿命に強制変換することができます。
'static
寿命を持つ変数を作成する方法は 2 つあり、どちらもバイナリの読み取り専用メモリに格納されます。
static
宣言で定数を作成する。&'static str
である string
リテラルを作成する。各方法の表示については、以下の例を参照してください。
// 'static 寿命を持つ定数を作成する。
static NUM: i32 = 18;
// 入力引数の寿命に 'static 寿命を強制変換して、NUM への参照を返す。
fn coerce_static<'a>(_: &'a i32) -> &'a i32 {
&NUM
}
fn main() {
{
// `string` リテラルを作成して表示する:
let static_string = "I'm in read-only memory";
println!("static_string: {}", static_string);
// `static_string` がスコープ外になると、参照はもはや使用できなくなりますが、データはバイナリに残ります。
}
{
// `coerce_static` に使用する整数を作成する:
let lifetime_num = 9;
// `NUM` を `lifetime_num` の寿命に強制変換する:
let coerced_static = coerce_static(&lifetime_num);
println!("coerced_static: {}", coerced_static);
}
println!("NUM: {} stays accessible!", NUM);
}
トレイト境界としては、型に非静的な参照が含まれていないことを意味します。たとえば、受信者は好きなだけ型を保持でき、破棄するまで無効になることはありません。
所有されたデータは常に 'static
寿命境界を通過するが、その所有されたデータへの参照は一般的に通過しないことを理解することが重要です。
use std::fmt::Debug;
fn print_it( input: impl Debug + 'static ) {
println!( "'static value passed in is: {:?}", input );
}
fn main() {
// i は所有されており、参照を含まないため、'static です:
let i = 5;
print_it(i);
// うーん、&i は main() のスコープによって定義された寿命のみを持っているため、'static ではありません:
print_it(&i);
}
コンパイラは次のように表示します。
error[E0597]: `i` does not live long enough
--> src/lib.rs:15:15
|
15 | print_it(&i);
| ---------^^--
| | |
| | borrowed value does not live long enough
| argument requires that `i` is borrowed for `'static`
16 | }
| - `i` dropped here while still borrowed
おめでとうございます!あなたは Static
実験を完了しました。あなたの技術を向上させるために、LabEx でさらに多くの実験を行って練習してください。