Rustのライフタイムについて
こんにちは、 @kz_morita です。
今回は Rust のライフタイムについてまとめます。
所有権規則とライフタイム 前回の記事 でも紹介したように、以下のコードはコンパイルエラーになります。
#[derive(Debug)]struct Foo{x: i32,}fn main(){lety: &mutFoo;{letmutx=Foo{x: 1};y=&mutx;// x のライフタイムここまで }println!("Hello, world! y: {:?}",y);// y のライフタイムここまで }y のライフタイムが main 関数のスコープ内なのに対して、x のライフタイムが内側のブロック内のため、値が参照よりライフタイムが短いためコンパイルエラーとなります。
ライフタイムの指定 次に以下のような MyInt という構造体を考えます。
struct MyInt{value: i64 }implMyInt{fn min(&self,n: &i64)-> &i64 {ifn>&self.value{&self.value}else{n}}}上記の min 関数では、MyInt の値と引数の小さい方の数値の参照を返します。
これを以下のように実行すると 1 が返ってくることを期待しますが、これはコンパイルエラーとなります。
fn main(){letmy_int=MyInt{value: 3};letn=1;println!("min: {:?}",my_int.min(&n));}error[E0623]: lifetime mismatch --> src/main.rs:11:13 | 7 | fn min(&self, n: &i64) -> &i64 { | ---- ---- | | | this parameter and the return type are declared with different lifetimes.