プログラミング言語Rust 「4.3. プリミティブ型」写経時のつぶやき
2018/12/13
変数束縛fを使って関数を実行できる
— ちゃまぐ (@tyamaguc07) 2018年12月13日
型推論は`type inference`というのか。
■ プリミティブ型
プリミティブ型は言語に組み込まれた型
■ ブーリアン型
boolと名付けられている型
trueとfalseの2つの値を持つ
■ char型
一つのユニコードのスカラ値を表す型
Rustのchar型は1byteでなく4byte
■ 数値型
— ちゃまぐ (@tyamaguc07) 2018年12月13日
Rustにはたくさんの種類の数値型がある
カテゴリとサイズという2つの部分から成る
カテゴリの種類「符号ありと符号なし」「固定長と可変長」「浮動小数点と整数」
数値リテラルが型を推論させるものを何も持たなければデフォルトの型になる
let x = 42; // xはi32
let y = 1.0; // yはf64
2018/12/14
■ 符号なしと符号あり
— ちゃまぐ (@tyamaguc07) 2018年12月14日
符号なし(unsigned)型はカテゴリ部に u を使う
符号あり(signed)型はカテゴリ部に i を使う
i はinteger(整数)の i
u8は符号なし8bitの数値
i8は符号あり8bitの数値
■ 固定長型
— ちゃまぐ (@tyamaguc07) 2018年12月14日
固定長型はそれぞれの表現の中に特定のビット数を持つ
指定することの出来るビット長は8, 16, 32, 64
u32は符号なし32bit整数
i64は符号あり64bit整数
■ 可変長型
— ちゃまぐ (@tyamaguc07) 2018年12月14日
実行環境のポインタサイズに依存する型
符号ありはisize
符号なしはusize
■ 浮動小数点型
Rustは2つの浮動小数点型を持つ(f32とf64)
■ 配列
— ちゃまぐ (@tyamaguc07) 2018年12月14日
固定長の同じ型の要素のリスト(リスト?目録と訳するほうが正しそうだが、直感的ではないなぁ。日本語難しい)
配列はデフォルトでイミュータブル
配列は[T; N]という型を持つ
T記法はジェネリクスのセクションで解説
Nは配列の長さのためのコンパイル定数
let a = [0; 20];
— ちゃまぐ (@tyamaguc07) 2018年12月14日
上記のコードは配列の各要素を同じ値で初期化するための省略表現
変数束縛aの各要素は0で初期化される
配列aの要素の個数はa.len()で取得できる
配列の特定の要素には添字記法でアクセスできる
— ちゃまぐ (@tyamaguc07) 2018年12月14日
添字はほとんどのプログラミング言語と同じように0から始まる
配列に含まれない添字を使おうとするとエラーになる
配列アクセスは実行時に境界チェックを受ける
2018/12/15
■ スライス
— ちゃまぐ (@tyamaguc07) 2018年12月15日
他のデータ構造への参照(またはビュー)
コピーすることなく、配列の要素への安全で効率的なアクセスを許すために便利
スライスは既存の変数束縛から作られる
スライスは定義された長さを持つ
スライスはイミュータブルにもミュータブルにも出来る
(ミュータブルにできる??)
・スライシング構文
— ちゃまぐ (@tyamaguc07) 2018年12月15日
スライスを作るためには、&との組み合わせを使う
&はスライスが参照と同じであることを示す
はスライスの長さを定義する
スライスは型 &[T] を持つ
■ str
— ちゃまぐ (@tyamaguc07) 2018年12月15日
str型は最もプリミティブな文字列型
型と言っているが実際は文字列スライスと表現したほうがしっくり来る
"hogehoge"としただけで、スライスが作られる(Perl脳だと違和感しかない)
str型は必ず元となるデータがある
— ちゃまぐ (@tyamaguc07) 2018年12月15日
Stringから作成したり、文字列リテラルで作成する場合はプログラム中にそのままバイト列として埋め込まれるhttps://t.co/njijMTdI4k
2018/12/16
■ タプル
— ちゃまぐ (@tyamaguc07) 2018年12月16日
タプルは固定長の順序有りリスト
【語源】quintuple(5要素の組)、sextuple(6要素の組)などの後半部分から
let x = (1, "hello"); // 型推論あり
let y: (i32, &str) = (1, "hello"); // 型推論なし
tupleは異なる型の値を含むことが出来る
tupleには他のtupleを割り当てる事ができる。(条件付き)
— ちゃまぐ (@tyamaguc07) 2018年12月16日
条件① 持っている型が同じ
条件② アリティが同じ
let mut x = (1, 2);
let y = (2, 3);
println!("{:?}", x); // => (1, 2)
x = y;
println!("{:?}", x); // => (2, 3)
■ letの追加解説
— ちゃまぐ (@tyamaguc07) 2018年12月16日
letの左辺にはパターンを書くことが出来る
letの左辺のパターンと右辺が一致した場合、複数の束縛を一度に割り当てる事ができる
let (x, y, z) = (1, 2, 3);
コンマをつけることで、要素1のtupleと丸括弧の中の値を混同しないように明示できる
— ちゃまぐ (@tyamaguc07) 2018年12月16日
let x = (0,);
let y = (0);
println!("{:?}", x); //=> (0,)
println!("{:?}", y); //=> 0 pic.twitter.com/XIkTYazA8m
■ tupleのインデックス
— ちゃまぐ (@tyamaguc07) 2018年12月16日
tupleのフィールドにはインデックス構文でアクセスできる
配列のインデックスと同じように添字は0から始まる
配列のインデックスと異なり、[] ではなく . を使う pic.twitter.com/1R25LY4i9t
2018/12/23
■ 関数
— ちゃまぐ (@tyamaguc07) 2018年12月23日
関数も型を持つ
fn foo(i32) -> i32 {
x
}
let fp: fn(i32) -> i32 = foo;
この場合のfpは関数ポインタ