ゆくゆくは有へと

おかゆ/オカ∃/大鹿有生/彼ノ∅有生 の雑記

Rustのメモ

“ownership” について

「所有権」と訳されているけれど、"ownership" のニュアンスを完全に捉えきれてるのかよく分からない。

英辞郎を引いてみると

  1. 所有権、所有、所有者[持ち主]であること
  2. 責任感、当事者意識

とあり、1の意義はOKとして、2の意義って「所有権」って語から察せるものなんだろうか?おかゆが単に世間知らずで、「所有権」にそういうニュアンスを感じることができないだけ?

“ownership” で大事なニュアンスはむしろ 2 のほうなんじゃないかって理解が浅いながら思うのだけど、つまり、「メモリ解放の責任をもつ」ってことかなって。ムーブは「責任の押し付け」で、借用はその責任を被らずに値を使わせていただくことのできる仕組みということかなって。

特に訳さず、「オーナーシップ」でいいような気もする。「ムーブ」もムーブだし。

IntoIterator

Python だと Iterable で、for .. in .. にぶち込むと勝手に iter してくれてるのが懐かしく思える。

このあたりのムーブセマンティクスの挙動は勉強しないとなあ

ライフタイム

どうでもいいんだけど、"ownership" は訳して、"lifetime" は「ライフタイム」なんやね。

ライフタイムよく分かんね~~

ライフタイムより:

struct Foo<'a> {
    x: &'a i32,
}

fn main() {
    let x;                    // -+ xがスコープに入る
                              //  |
    {                         //  |
        let y = &5;           // ---+ yがスコープに入る
        let f = Foo { x: y }; // ---+ fがスコープに入る
        x = &f.x;             //  | | ここでエラーが起きる
    }                         // ---+ fとyがスコープから出る
                              //  |
    println!("{}", x);        //  |
}                             // -+ xがスコープから出る

エラーが起きるのは分かるけど、ライフタイム明記せなコンパイラちゃんは認識できんの?と思ってライフタイム指定消してみよ:

struct Foo {
    x: &i32,
}

fn main() {
    let x;                    // -+ xがスコープに入る
                              //  |
    {                         //  |
        let y = &5;           // ---+ yがスコープに入る
        let f = Foo { x: y }; // ---+ fがスコープに入る
        x = &f.x;             //  | | ここでエラーが起きる
    }                         // ---+ fとyがスコープから出る
                              //  |
    println!("{}", x);        //  |
}                             // -+ xがスコープから出る

にしてみたら、

error[E0106]: missing lifetime specifier
 --> src\main.rs:2:8
  |
2 |     x: &i32,
  |        ^ expected lifetime parameter

error: aborting due to previous error
error: Could not compile `practice`.

あ、なるほど、指定子ないぞ!って怒られるのか。

内部構造にどっかの参照(借用)をもってるから、ってことかしら…。まあそうだろうけど…。

コンパイラちゃんはどこを見て指定子が必要なところかどうかを見極めるんだろ?
「内部構造に借用の型を持ってたら」かな?「外側(ガワ)にライフタイムを伝播」させるために、ライフタイム指定子が必要?

関数アノテーションでのライフタイム省略については、「ライフタイムの関わる出力は、大抵入力のライフタイムと関連あるやろ(鼻ホジ」ってことでしょう…。

“mutablity” について

ミュータビリティ

一方で、Rustで「イミュータブル(immutable)」について言及するとき、変更不可能であることを意味しない: 「外側のミュータビリティ(exterior mutability)」を表します。例として、Arc を考えます:

うーん。原文は

However, when we say something is ‘immutable’ in Rust, that doesn’t mean that it’s not able to be changed: we are referring to its ‘exterior mutability’ that in this case is immutable. Consider, for example, Arc:

「しかしながら、Rustで私たちが「あるモノがイミュータブル(immutable)だ」と言うとき、別にそれが変化し得ないと言っているわけではありません。そうではなく、「外側のミュータビリティ」に関してイミュータブルだと言っているわけです。」

これくらいの意味だろう…。