今年の言語はRust その３



Rustを学びます
![mozilla-rust-lang-348x196.jpg](https://qiita-image-store.s3.amazonaws.com/0/62413/ce05f3a3-34b6-fefb-2de4-c7903e83eeb4.jpeg)


勉強ページは日本語ドキュメント

[プログラミング言語Rust](https://doc.rust-jp.rs/)

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル
https://doc.rust-lang.org/book/



## 3. Common Programming Concepts

## 3.1 変数と可変性 - Variables and Mutability

```rust

fn main() {
    // -- Binding
    let x = 5;
    // x = 6; Error
    
    // -- Mutable
    let mut y = 5;
    y = 10;
    
    // -- Const
    const MAX_POINTS: u32 = 100_00;
    
    // -- Shadowing
    let z = 10;
    let z = z + 10;
    let z = z * 10;
    
    let spaces = "    ";
    let spaces = spaces.len();
    
    
}

```

## 3.2 データ型 - Data Types

Rustは静的型付き言語であるため、
コンパイル時にすべての型が「判明」している必要がある。

```rust
fn main() {
    let guess_non_typedef = "42".parse().expect("Not a number!");
}

====================================================
$ cargo run
   Compiling var v0.1.0 (/home/ec2-user/environment/var)
error[E0282]: type annotations needed
 --> src/main.rs:3:9
  |
3 |     let guess_non_typedef = "42".parse().expect("Not a number!");
  |         ^^^^^^^^^^^^^^^^^
  |         |
  |         cannot infer type
  |         consider giving `guess_non_typedef` a type

error: aborting due to previous error

For more information about this error, try `rustc --explain E0282`.
error: Could not compile `var`.

To learn more, run the command again with --verbose.
```

どの型を使用したいのかを知るのに、コンパイラがプログラマからもっと情報を得る必要があることを意味します:

parseのために型を指定しないと

```rust
fn main() {
    let guess: u32 = "42".parse().expect("Not a number!");    
}

```

### スカラー型

```rust
fn main() {
    // -- Scalar
    let v: i8;  // -(2^7) <= v <= (2^7)-1
    let v: u8;  //      0 <= v <= (2^8)-1
    let v: i16;
    let v: u16;
    let v: i32;
    let v: u32;
    let v: i64;
    let v: u64;
    
    let v: isize; // OSが64ビットアーキテクチャなら、64ビット. 32ビットアーキテクチャなら、32ビット
    let v: usize;
    
}

```
整数型の基準はi32型です: 64ビットシステム上でも、 この型が普通最速になります

### 整数リテラル

```rust
fn main() {
    
    let x = 98_222;
    println!("x={}",x);
    
    let x = 0xff;
    println!("x={}",x);
    
    let x = 0o77;    
    println!("x={}",x);
    
    let x = 0b1111_0000;
    println!("x={}",x);
    
    let x = b'Z';
    println!("x={}",x);
}

$ cargo run
x=98222
x=255
x=63
x=240
x=90

```

### 浮動小数点型

```rust
fn main() {
    
    let f: f32;
    let f: f64;
    
    let x = 2.0; // f64 (Default)
}

```


浮動小数点数は、IEEE-754規格に従って表現されています
浮動小数点数の表現方法  |電子工作](http://www.picfun.com/mathlib02.html)


### bool

```rust
fn main() {
    
    let b = true;
    
    let b: bool = true;
}

```

### 文字

文字はシングルクウォートで表します

```rust
fn main() {
    
    let c: char = 'z';
    let c = 'a';
    
    // string
    let heart_eyed_cat = '😻';    //ハート目の猫
}

```

## タプル
```rust
fn main() {
    // -- Tuple
    let tup: (i32, f64, u8) = (500, 6.4, 1);
    
    // -- Paturn Match
    let tup = (500, 6.4, 1);
    let (x, y, z) = tup;
    
    // index
    let x = tup.0;
    let y = tup.1;
    let z = tup.2;
}

```

## 配列

1. すべて同じ型
2. 固定長. サイズは伸縮不可

```rust
fn main() {
    // -- Array
    let a = [1,2,3,4,5];
    
    let first = a[0];
    let second: i32 = a[1];
}

```

```rust
fn main() {
    // -- Array
    let a = [1,2,3,4,5];
    
    let first = a[0];
    let second: i32 = a[1];
    
    
    // -- Index access error
    
    let index = 999;
    let element = a[index];
    
    println!("The value of element is: {}", element);
}

-----------------------------------------
$ cargo run
thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 999', src/main.rs:12:19
```



特に特筆すべきはありませんでした。

次回は関数です。