実践Rust入門 4日目

4章頭から4章最後まで。

主にプリミティブ型について。
サンプルコードは動かさないスタイルで読んだだけ。

おぼえがき

ポチポチ打ちながら読んでたら長くなった。
こんな一気に覚えられるわけない。

  • スカラ型

    • ユニット ()
    • 真理値 bool, true/false
    • 整数 i/u+16/32/64/128, i/u+size, 0xff, 0o744, 0b1010, b'A'
      • 符号なしビットシフトはないっぽい
      • オーバーフローはDebugビルドだとPanic、Releaseビルドだとオーバーフロー値
        • checked_*/saturating_*/wrapping_*/overflowing_*
    • 浮動小数点数 f32/f64, 0.0, -1_2.34, 123E+66
    • 文字 char, 'A', '\', '\x7F', '\'', '漢', '\u{5b57}'
      • サイズは4byte固定っぽい
      • Unicodeで使えるのはUnicodeスカラ値のみ(U+0〜D7FF, U+E000〜U+10FFFF)
    • 参照 &(読専), &mut(読書), *val(値参照)
      • メモリ安全なポインタ
    • 生ポインタ const T, mut T,
      • メモリ安全でないポインタ
      • unsafe内でしか使えない(定義はunsafe外でいい)
    • 関数ポインタ fn(i32) -> i32,
      • let mut f: fn(i32) -> i32 = double; f(2);
      • 型注釈がない(let mut f = double;)と関数定義型と解釈されコンパイルエラー
        • 関数定義型に同じ型はないため
      • 外部変数を参照するクロージャは関数ポインタ型になれない
      • 外部変数を参照しないクロージャは関数ポインタ型になれる
      • クロージャを要求される場面では、関数ポインタを渡せる
        • 関数ポインタは、クロージャのトレイト(Fn,FnMut,FnOnce)を自動で実装するから
  • プリミティブな複合型

    • タプル (i32, f64, char)
      • 素数をアリティと呼ぶらしい
      • let tp =(59, 63); tp.0 ... 59 / tp.1 ... 63
      • let文のパターンマッチで分解ができる
        • let (tx, ty, _) = ((1, 2), (3, 4), (5, 6)); tx ... (1, 2) / ty ... (3, 4) / _ ... Goみたいに無視
      • mutを付ければ可変にもできるっぽい
        • 要素の書き換えは要素にref mutをつける
          • let ((ref mut px, ref mut py), _) = ((1, 2), 'A')
    • 配列 [false, true], [0; 100] ... ([初期値; 要素数])
      • 要素の型はCopyトレイトの実装が必要
      • 固定長
      • OutOfIndexがコンパイル時に検出できないものは実行時にパニック
      • イテレータが使える arr.iter()
      • と思ったら、len(),get(),iter()などはスライスのメソッド
        • 配列に対してスライスのメソッドを使うと、暗黙的にスライスへ「型強制」する
    • スライス &[bool], &mut [bool], Box<[boo]l>
      • 配列要素に効率よくアクセスするための「ビュー」
      • 配列だけでなく、メモリに連続的に同じ型のデータを対象にできる(ベクタや多言語作成の配列など)とのこと
      • 対象に&と[]をくっつける (型強制で自動的に使われるので無理に使う必要はないかも)
        • &arr[..](=&arr) 全体へアクセス可
        • &arr[1..5] 要素1〜4までアクセス可
        • &arr[1..=5] 要素1〜5までアクセス可
      • Box<[T]>はデータを所有する。実データはヒープに作られる
    • 文字列スライス "abc"
      • \エスケープ
      • リテラルを複数行に渡って書くと、改行やスペースが入る
      • r#"raw文字列"# エスケープを多用する正規表現などで便利とのこと
      • r###"raw文字列 "##"を含めても大丈夫"###
      • UTF-8形式でエンコード
      • len()はUTF-8のバイト数
      • ん、何文字目をサクッと取り出す方法がない?
      • s.chars() char型のイテレータを取り出す
      • s.char_indices() charとstr上の開始バイトがペアになったタプルを取り出す
      • 1行ずつ取り出すイテレータもある let mut lines =strval.lines(); lines.next()
      • 可変の文字列スライスは、char,strから直接作れない。String型を経由する
        • let mut s1 = "aあ".to_string(); let s2 = "a1.as_mut_str();"
        • 可変と言っても要素の追加・削除はできない。要素の中身は変更できる
  • unreachable!()で強制パニック終了

課題

実践Rust入門[言語仕様から開発手法まで]

実践Rust入門[言語仕様から開発手法まで]