###### tags: `Rust` `youtube` `type` `condition` `loop` # Rust language Crush Course 2 # 8. Types RustのPrimitive型 - Int : デフォルトは i32 - i8, i16, i32, i64, i128 - u8, u16, u32, u64, u128 - Float - f32, f64 - bool - char - Tuples : タプル。変更不可のイテレーター - Arrays : 配列 std::\<type> : 標準ライブラリに用意される型 便利なプロパティやメソッドも使える std::i32::MAX = i32 type の最大値 ```rust= pub fn run(){ // デフォルトintはi32(4byte) let x = 1; // デフォルトfloatはf64(double) let y = 2.5; // 宣言時に型を明示するなら、 : コロンのあとに型 let z: i64 = 4554545454; println!("Max i32: {}", std::i32::MAX); println!("Max i32: {}", std::i64::MAX); // 真偽値 let is_active = true; // 式からbool値を取得 let is_greater = 5 > 0; // Char型 // '' シングルクウォートはchar型にしか使えない // 文字列で "" ではなく '' を使うとエラー let c = 'a'; println!("{:?}", (x, y, z, is_active, is_greater, c)); } ``` # 9. Strings 型はstr 文字列には2つのタイプが有る - Primitive Strings : 不変の固定長の文字列。メモリのどこかに保持される - String : 可変長で、ヒープに割り当てられたデータ構造。変更できる。 ## string method - len() : 長さを返す - .push(char) : char型を1文字後ろに挿入 **mut** をつけた可変Stringでないと実行できない - .push_str(str) : 文字列を後ろに挿入 - .Contains(str) : 文字列を含んでいるかをboolで返す - .replace(from_str, to_str) : 文字列を置き換える - .split_whitespace() : 空白で単語を区切ってarrayで返す ## String Loop ~~文字列はイテレータブルなオブジェクトなので、for loopできる。~~ pythonと異なり、Stringはcharのlistではない array や tuple ではないので、char型配列にしないと回せない - string.split("") : 空文字で区切る = すべての文字を要素とした配列になる - string.split_whitespace() : 単語ごと `for char in string { code }` ## capacityありStringを作成 String::with_capacity(int) で容量の決まったStringオブジェクトを作成する # 10. Tuple - タプルは値のグループ - 最大12要素 - 各要素は異なる型でもよい ex. `person: (&str, &str, u8) = ("max", "mix", 210);` println()で複数のフォーマットに自動で展開してくれたりはしない 簡易的な構造体のような使い方もできそう 各要素を使うには、 tuple.0 , tuple.1 ... のように番号を書く ```rust= pub fn run(){ let person: (&str, &str, i8) = ("masaharu", "hosomichi", 24); println!("{} is from {} and is {}",person.0, person.1, person.2); } ``` # 11. Array なかなか融通の聞かなそうなarray でも、型付き言語としては厳密な感じ 書式 ```rust= let numbers: [type; len] = [primitive * len]; numbers[0]; // 0番目の要素にアクセス numbers.len(); // 要素数 = 5 std::mem::size_of_val(&numbers); // 変数のバイト数を返す。 i32 * 5 = 20 byte ``` 豆知識. ### & アドレス演算子 C/C++ や Go と同様に&でアドレスを表示できる # 12. Slice arrayを部分的に切り取ったもの 書式 ```rust= let slice: &[type] = &array; // 範囲を指定 let slice: &[type] = &array[start..end]; ``` # extra. use キーワード use package::module; と書くと、パッケージ名を省略できる。 以下は、stdを省略して mem module を使っている例 ```rust= use std::mem; mem::size_of(); ``` # 13. Vector 可変長配列 配列のメソッドをすべて使える 書式 ```rust= let mut numbers_vec: Vec<i32> = vec![1,2,3,4]; numbers_vec.len(); numbers_vec[0]; let slice: &[i32] = numbers_vec[0..3]; ``` vectorは、配列と異なり要素を追加・削除できる。 ```rust= // push numbers_vec.push(5) numbers_vec.push(6) // pop 末尾の要素を返す numbers_vec.pop() // 6 numbers_vec.pop() // 5 ``` ## vector.iter() for in 文 でループを回したいとき、 .iter()メソッドを使う ```rust= for i in numbers_vec.iter() { println("{}", i); } ``` ## vector.iter_mut() iter_mut()を使うと、for in 文で渡されるのが値ではなくポインタになる つまり、loop中でシーケンスオブジェクトの要素を操作できる ```rust= for x in numbers.iter_mut(){ // ポインタの中身を2倍する *x *= 2; } ``` # 14. Conditionals いわゆる条件文 全く持って C/C++な感じ ただし、条件に()がいらない ```rust= let age = 15; if age > 12{ println!("greater 12"); } else if age == 12 { println!("equal to 12"); } else { println!("child"); } // 短縮if (代入文) let is_of_age = if age >= 21 {true} else {false}; println!("{}", is_of_age); ``` # 15. loops - loop : 無限ループを作るキーワード - while : 条件ループ - for x in 0..100 : 100回(0 ~ 99)まで繰り返すループ 条件式に()はいらない ```rust= pub fn run(){ let mut count = 0; loop { count += 1; println!("Num: {}", count); if count == 20 { break; } } while count <= 100 { if count % 15 == 0 { println!("fizz buzz"); } else if count % 3 == 0 { println!("fizz"); } else if count % 5 == 0 { println!("buzz"); } else { println!("{}", count); } count += 1; } for count in 0..100 { if count % 15 == 0 { println!("fizz buzz"); } else if count % 3 == 0 { println!("fizz"); } else if count % 5 == 0 { println!("buzz"); } else { println!("{}", count); } } } ``` # おさらい ## 学んだこと - Typeの種類 - Primitive(最初からあるやつ、値コピー) - i/u - f - char - bool - array - tuple - non-Primitive(派生タイプ、参照コピー) - String - Vector - String type の取扱い - method - split - slice - loop - Tuple type - 要素へのアクセスの仕方 - Array - 固定長配列 - Vector - 可変長配列 - テンプレートで異なる型に対応 - 条件文 - 条件式に()がいらない - 繰り返し - loop : 無限ループ - while : 条件付きループ - for in : iteratorのループ - 0..100 : 数値の範囲のイテレーターを作る [TOC]