Rustのライフタイムについて。
まず、多くのプログラミング言語では、「スコープ」という概念がある。
これは変数の寿命のことで、変数は例えば{}で括られた範囲でしか有効ではない。
この仕組みはRustにもある。
#include <iostream> int main() { { int value = 10; value = 20; } printf("%d\n", value ); // コンパイルエラー valueはこのスコープに存在しない }
fn main( ){ { let mut value = 10; value = 20; } println!("{}",value);// コンパイルエラー valueはこのスコープに存在しない }
それとは別に、Rustには「ライフタイム」という概念がある。
ライフタイムは「参照の有効範囲」のことで、C++などでは参照が実は切れていることを、実行時にしか判別できない(下コード左)。
しかしRustではコンパイルの段階で明らかに参照が切れているような状態を検出できる(下コード右)ので、参照が切れるようなコードはそもそもコンパイルが通らず、実行すること自体ができない。
故にRustでは「ビルドが通ったなら安易な参照切れは起こしていない」と言える。
#include <iostream> struct AB { int a, b; }; int main() { auto myref = std::make_unique<AB>(AB{ 5,10 }); { auto ab = std::move(myref); // ここで myrefからabへmove printf("%d\n", ab->a); } // 実行時エラー 参照先が無効 auto k = myref->a; printf("%d\n", k); }
struct AB{ a:i32, b:i32, } ////////////////////////////////////////////////// fn main( ){ let myref=AB{a:5,b:10}; { let ab=myref; // ここで myrefからabへmove println!("{}",ab.a); } // コンパイルエラー 参照先が無効 let k = myref.a; println!("{}",k); }