THINK

Rust覚書2

2/17/2020

関数

関数はスネーク記法で記述する

fn main() {
    another_funcion(5, 5, 5.4);
}

fn another_funcion(x: i32, y: u32, z: f32) {
    println!("x: {}, y: {}, z: {}", x, y, z);
}

ステートメント: statement

なにかを実行して、値を返さないもののことを指すらしい

rustでは変数宣言が statement に該当する

値を返さないため、 CRuby のような x = y = 6 といった記述は出来ない

let x = (let y = 6); // compile error

式: expression

なにかを評価するのが式

rust のほとんどは式で構成されている

関数などが式に該当する

5 + 6 は式であり、 11と評価される

let x = 5;
let y = {
    let x = 3;
    x + 1 // do not include ending semicolons.
};
println!("{}", y); // 4

式にはセミコロンは含まれない

式の最後にセミコロンを付けると、それはステートメントになり、値が返されなくなる

なんかややこしいけど、 最後にセミコロンを付けなかった値が return されるという認識で合っていると思う

評価って言葉が良くないかも

返り値付きの関数

返り値の指定には矢印(->)を使う

fn five() -> i32 {
    5 // do not include ending semicolons.
}

fun main() {
    let x = five();
    println!("{}", x);
}

値を返す場合、うっかりセミコロンを付けると空のタプルが返ってコンパイルエラーとなる

ちゃんとエラーメッセージでヒントが出るので、ちゃんとエラーメッセージを読もう(戒

if式

ごく普通の ifって印象

let number = 3;

if number < 5 {
    println!("foo");
} else if number == 5 {
    println!("five!");
} else {
    println!("bar");
}

条件は bool である必要があり、 RubyJavaScript のように boolではない型を自動変換しようとはしない

if は式である

式なのでステートメント letの右側で使える

let condition = true;
let number = if condition {
    5
} else {
    6
};

ただし、型は一致させること

コンパイル時に型が不明確だとエラーになる

繰り返し処理

loop, while and forの3つがある

loop

loop {
    println!("loop!");
}

breakで抜けられる

また breakには値を返す機能もある

let mut counter = 0;

let result = loop {
    counter += 1;

    if counter == 10 {
        break counter * 2;
    }
};

おそらく、式とは別もの?

breakは式らしい?

while

ごく一般的なやつ

ただし、 loopのような let宣言にはどうも使えないっぽい

let mut number = 3;

while number > 0 {
    println!("{}!", number);

    number -= 1;
}

for

ごく一般的なやつ

配列で使うと非常に有効

let a = [10, 20, 30, 40, 50];

for element in a.iter() {
    println!("the value is: {}", element);
}

または、特定の回数繰り返し

// 1 <= n < 4
for number in 1..4 {
    println!("{}!", number);
}

// 1 <= n <= 4
for number in 1..=4 {
    println!("{}!", number);
}

// 4 > n >= 1
for number in (1..4).rev() { // reverse
    println!("{}!", number);
}

参考