###### 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]