Open9

The Bookやり直す

shuntakashuntaka

Rustも予約されている関数をプレリュードと呼ぶんだった...最近Haskellがそれだった...

shuntakashuntaka

3.3.

文とは、なんらかの動作をして値を返さない命令
式は結果値に評価されます

このようなコードを書くと、式(expression)を予期しましたが、文(statement)が見つかりましたというエラーが出ます。

let x = (let y = 6);
pythonの場合
>>> x = y = 6
>>> x
6

Rustではコンパイルエラーが出るのに対して、Pythonでは出力されません。

これはletが文を示すので、値を返さない。Rustでは変数定義は副作用を伴うので、文として解釈される。
letにletを入れても、letのイコールに入れるものは値であり、式を入れる必要がある。

ifは式なので、以下のような書き方が可能

let number = if condtion { 5 } else { 6 };
shuntakashuntaka

= help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from

この関数の戻り値の型には借用された値が含まれていますが、借用元となる値が存在しません。

shuntakashuntaka

match, if letってOptionとか値型から値を取り出すという機能的な側面を無意識的に使ってて、言葉としては忘れている

shuntakashuntaka

8.1.

コンパイルエラー

    {
        let mut v = vec![1, 2, 3, 4, 5];
        let first = &v[0];
        v.push(6);
        // error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable

        println!("The first element is: {}", first);
    }

Vec<T>は、新しい要素を追加するときにキャパシティが足りない場合、新しいメモリ領域を確保して既存の要素をコピーします。これにより、firstが指していた場所が無効になる可能性があります。(claude)

これと似ているよね。結局ミュータブルでヒープに割り当てたものは、値が増えた際にポインタが変わって参照側が壊れるのを防いでいるんだよね。

Stringも内部的にはVec<u8>を使用しているため、push_strメソッドによって再割り当てが発生する可能性があります。(claude)

内部的にVec<u8>使ってたら一緒だわ 🤣

    {
        let mut s = String::from("aa");
        let s2 = &s;

        s.push_str("bbb");
        println!("{:?}", s2)
    }