Rustまとめ-その壱-(随時更新)

# Rustまとめ-その壱-(随時更新)

## これまでのまとめリンク

- [Rustまとめ-その弐-(随時更新)](https://qiita.com/eisuke114/items/693c8b5628cfc2664d30)
- [Rustまとめ-その参-(随時更新)](https://qiita.com/eisuke114/items/422702e346ce11003b33)
## 変数基本
```
//let文で変数を宣言
let orange = 3;
//ただしこのままだと値を変更することができません。
//変数名の前に`mut`を追加する
let mut orange = 3;
//これで中身に変更が加えられるようになります。
```
## 複数の変数を`println!`で表示
```
let x = 1;
let y = 20;
//{}に値が入ります。
//この場合だと一番目のxの値は一番の波括弧、yは二番目の波括弧に入ります。
//左からコンマで区切った順に値が入っていくようです。
println!("x = {} and y = {}",x,y);
```
## Cargo.lockファイルの役割
一度ビルドに成功すると`Cargo.lock`ファイルが生成されます。とあるクレートを利用していてそのクレートのバージョンを更新した際に それまでに書いていたコードにエラーが出る可能性がありますよね?
そういった不具合にならないように`Cargo.lock`にビルドが通ったバージョンを記録しておき、エラーが出そうだと判断された場合に記録されたバージョンのものが選択され実行するようにしています。
## 外部の関数呼び出してメソッドを使う
```
//呼び出すクレート
use rand::Rng;

//実行する関数
fn main(){

//1~101の間の数字をランダムに生成し変数に入れる
// rand::thread_rng()`関数を選択し
// `.gen_range(1..101)`その中のメソッドを実行(乱数を生成するやつ)

let secret_number=rand::thread_rng().gen_range(1..101);

}
```
## 変数のシャドーイング
前に宣言した変数と同じ名前の変数を宣言できます。そして以前に宣言した方の変数を覆い隠します。  
弧の変数を呼ぶと最後に宣言された変数の値が呼び出されます。
```
//不変変数の場合
fn main(){
    //`mut`キーワードが挿入されてないので不変変数となります。
    let x = 5;
    //不変変数なのですが再度同じ名前の変数を宣言することにより実質的に変数の変更をすることができます。
    let x = x + 1;//x = 6
    
    let x = x * 2;//x = 12
    
    println!("xの値は: {} ", x);
    //出力結果は12になります。
}
//可変変数の場合
fn main(){
    //`mutキーワードをつけて可変変数にする
    let mut x = 5;
    //変数名のみでそのまま変更できます。
    x = 6;
    
    x = 12;
    
    println!("xの値は: {}", x);
    //出力結果は12になります。
}
```
## 不変変数で値を変更する利点
```
//不変変数の場合
//入力されたスペースの数を保持したい場合
let spaces = "   ";//3回スペース
let spaces = spaces.len();//入力された数を呼び出すメソッドを代入

//可変変数の場合
let mut spaces = "   ";//3回スペース
spaces = spaces.len();//入力された数を呼び出すメソッドを代入
```
上記にある可変変数の場合だとコンパイルエラーが起きます。  
`mut`キーワードを使うと値へ変更できるがかたが変わらないという点があります。
この場合だとスペースは`string型`となりそれを`spaces.len()`で`数値`に変更しているためエラーが起きます。  

不変変数だと`let文`を使い新しく変数を宣言した形になるので型を気にすることを少なくすることができます。
## 関数の命名規則
基本的に関数名は小文字で単語ごとにアンダーバーで区切ります。
```
//プログラム実行時に最初に走る関数
fn main(){
    //関数を動かす
    test_function();
}
//fn 関数名(){}で関数作成
fn test_function(){
    println!("テストファンクション");
}
```
## 関数の引数使い方
引数を設定するときには必ず引数の型を指定する必要があります。
```
fn main(){
    //引数に%を入れた
    test_function(5)
}
//引数のi32は値の型です
fn test_function(x: i32){
    println!("xの値は: {}",x);
}
//出力結果"xの値は:5"

```
## 戻り値のある関数
//関数名の設定をした後に`->型名`を設定する
```
//->i32で戻り値の型を設定
fn five() -> i32{
    5
}

fn main() {
    let x = five();
    
    println!("xの値は: {}",x);
}
//出力結果は"xの値は: 5"
```
## 戻り値のある関数注意点
戻り値のある関数の中身の最後の行にセミコロンはつけない
```
fn five(x: i32) -> i32{
    //x + 5;最後にセミコロンをつけるとエラーが出ます。
    x + 5
}

fn main() {
    let x = five(1);
    
    println!("xの値は: {}",x);
}
//出力結果は"xの値は: 6"
```
## if文の書き方
```
fn main() {
    let num = 3;
    //条件式はbool型でないといけません。
    if num < 5 {
        println!("条件は真です。")
    } else {
        println!("条件は偽です。")
    }
}
```
## ループでの繰り返し
`loop{}`で囲むと`break;`を途中で挟まない限り永遠と行動し続けます。
```
fn main() {
    loop{
        println!("繰り返し");
    }
}
```
## whileで条件付きループ
```
fn main() {
    let mut num = 3;
    //numの値が0以外だとループし続けます。
    while num != 0 {
        println!("{}",num);
        
        num = num - 1;
    }
    //numの値が0になったのでループから抜けます。
    println!("発射");
}
```
## forで配列の値を全て取り出す
```
fn main() {
    let a = [10, 20, 30, 40, 50];
    //iter()メソッドで配列の要素をひとつずつ取り出す
    for element in a.iter() {

        println!("the value is: {}", element);
    }
}
```