Rustの基本文法（関数）


公式サイト

https://www.rust-lang.org/ja/tools/install


### 関数

関数を定義するため`fn`キーワードにて新しい関数を定義する。
`main`関数は、多くのプログラムの最初に実行される関数（エントリーポイント）になる。
関数と変数の命名規則は、**スネークケース**を使うことが慣例になる。

<aside>
💡 Rustのコンパイラはどこで定義されているかは気にしない。どこかで定義されているかを気にする。

</aside>

サンプルコード）

```rust
fn main() {
    println!("Hello, world!");

    another_function();
}

fn another_function() {
    println!("Another function.");  // 別の関数
}
```

実行結果）

```bash
$ cargo run
   Compiling basic_syntax v0.1.0 (/home/xxxxx/workspace/rust/xxxxx)
    Finished dev [unoptimized + debuginfo] target(s) in 0.86s
     Running `target/debug/basic_syntax`
Hello, world!
Another function.
```

**引数を定義**

引数を持つように定義することが可能。
関数に引数があると、実際の値を渡すことができる。
仮引数（関数内で定義している引数）と実引数（関数の呼び出しもとにて定義している引数）にて定義する必要がある。

<aside>
💡 仮引数を定義する場合、データ型を定義することが必須になる。
</aside>


```rust
// 例)
fn print_label( value: i32, label : char ) { }
```


> 関数は、引数を持つようにも定義できます。引数とは、関数シグニチャの一部になる特別な変数のことです。
関数に引数があると、引数の位置に実際の値を与えることができます。
技術的にはこの実際の値は ***実引数***と呼ばれますが、普段の会話では、仮引数("parameter")と実引数("argument")を関数定義の変数と関数呼び出し時に渡す実際の値、 両方の意味に区別なく使います
> 

サンプルコード）

```bash
fn main() {
    print_labeled_measurement(5, 'h');
}

fn print_labeled_measurement(value: i32, unit_label: char) {
    println!("The measurement is: {}{}", value, unit_label);
}
```

実行結果）

```bash
$ cargo run
   Compiling basic_syntax v0.1.0 (/home/xxxxx/workspace/rust/xxxxx)
    Finished dev [unoptimized + debuginfo] target(s) in 0.14s
     Running `target/debug/basic_syntax`
The measurement is: 5h
```

**戻り値のある関数**
関数を呼び出したコードに値を返すことができる。戻り値に矢印（->）の後にデータ型を宣言する。
Rustの場合、関数の戻り値は関数本体ブロックの最後の式が値になる。
`return`キーワードにて関数から早期のリターンを使用して、値を使用することもできないことはない。
多くの場合は、関数の最後の式を暗黙に返す。

サンプルコード）

```rust
fn main() {
    let x = plus_one(5);

    println!("The value of x is: {}", x);
}

fn plus_one(x: i32) -> i32 {
    x + 1
}
```

実行結果）

```bash
$ cargo run
   Compiling basic_syntax v0.1.0 (/home/xxxxx/workspace/rust/xxxxx)
    Finished dev [unoptimized + debuginfo] target(s) in 0.14s
     Running `target/debug/basic_syntax`
The value of x is: 6
```

**関数本体は、文と式を含む**

Rustは式指向言語になる。
文と式とあり、違いについて公式にて説明されている。

> ***文***とは、なんらかの動作をして値を返さない命令です。 ***式***は結果値に評価されます。
> 

例えば、`let`キーワードを使用して変数に値を代入することは文になる。

```rust
fn main() {
    let y = 6;
}
```

関数の定義についても同じく文になる。
そのため、文は値を返さない。そうなると戻り値を定義した場合は式を入れる必要がある。
※下記サンプルコードの`another_function()`の`x + 1`を消した場合、エラーが発生する。
サンプルコード）

```rust
fn main() {
    println!("Hello, world!");

    let x = another_function();
    println!("{}",x)
}

fn another_function()->i32 {
    let x = 10;
    x + 1
}
```

実行結果）

```rust
$ cargo run
   Compiling basic_syntax v0.1.0 (/home/xxxxx/workspace/rust/xxxxx)
    Finished dev [unoptimized + debuginfo] target(s) in 0.13s
     Running `target/debug/basic_syntax`
Hello, world!
11
```

式は、文の一部になる。
新しいスコープを使用するブロック{ }も同じく式になる。
サンプルコード）

```rust
fn main() {
    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {}", y);
}
```

実行結果）

```rust
$ cargo run
   Compiling basic_syntax v0.1.0 (/home/xxxxx/workspace/rust/xxxxx)
    Finished dev [unoptimized + debuginfo] target(s) in 0.16s
     Running `target/debug/basic_syntax`
The value of y is: 4
```

上記のコード`let x = 3`という文は値を返さない。
また、`x + 1`に注意が必要になる。式は終端にセミコロンを含まない。
式の終端にセミコロンを付けたら文を変えてしまう。そして、文は値を返さない。