TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

Rustのライフタイムはスコープとは同じものではない

ライフタイムとは

ライフタイム | Rust by Example

コンパイラ(借用チェッカーと呼ばれる場合もあります)が、全ての借用に問題がないことを確認するために使用する仕組み

ざっくりライフタイムの使い所

  • 借用するときに使える (&とほぼペア)

ライフタイムの例

ライフタイムで参照を有効化する - The Rust Programming Language
ここによると以下の例の時、スコープ終了した後なのに参照しようとしているのでエラーとなる

{
    let r;

    {
        let x = 5;
        r = &x;
    }

    println!("r: {}", r); // error
}

ライフタイム VS スコープ

ライフタイム | Rust by Example

ライフタイムとスコープは同時に語られることが多いですが、同じものではありません。

今までは同じようなものかと思っていたし、スコープ外だから参照持ってたらいけないのは当たり前なのではと思っていのですが、ライフタイムを明示することで、生存期間を伸ばすことが可能みたいです。
上のコードにライフタイムを明示してあげると、xのライフタイムが伸び、rが参照できるようになりました。

fn takoyaki<'a>() {
    let r: &'a i32;
    { 
        let x: &'a i32 = &5;
        r = x; 
    } 
    // println!("x: {}", x); // error: cannot find value `x` in this scope
    println!("r: {}", r); // ok! ライフタイム伸びた!
}

xは外側からは参照できないので、「ライフタイム ≠ スコープ」という図式になりました。

余談

let r: 'a i32;
ができると思って書いてたらエラーが出て、かなりの時間困っていました!
ライフタイムは借用とセットなので&がいることに気づかなかった・・・