電気ひつじ牧場

技術メモ

Rustにっき/7日目・式

7日目は式の話です。

文は値を返しません。一方、式は値を返します。大抵の言語ではifやforは文ですが、Rustではこれらは式となり、戻り値を持ちます。

let a = 1;
let m = 
    if a > 0 {
        "a > 0"
    } else {
        "a <= 0"
    };
println!("{}", m);

実行すると以下のように出力されます。

a > 0

ブロックの最後にあるセミコロンなしの式が戻り値になります。

宣言と定義

コンパイラに識別子の型と名前を伝えるのが宣言、初期化を伴い領域の確保や挙動の決定をするのが定義です。Rustではどちらも行うことが可能です。

let a; //型は省略できる
a = 2;

同じ変数名で再定義することも可能です。

let m = "defined";
println!("{}", m);
let m = "redefined";
println!("{}", m);
defined
redefined

match式

switchのようなものです。_で全てのパターンにマッチします。

let code = 2;
let r = match code {
    0 => "zero",
    2 => "two",
    _ => "none"
};
print!("{}", r);
two

ループ

for

for i in 0..5 {
    println!("{}", i);
}

for(int i = 0; i<n; i++)タイプのforはありません。

loop

loop {}で無限ループを表現できます。

fn serve_forever(socket: ServerSocket, handler: ServerHandler) -> ! {
    socket.listen();
    loop {
        let s = socket.accept();
        handler.handle(s);
    }
}

!というのは値が帰ってこない関数の戻り値として利用できる型です。exit()などもこの型の戻り値を持ちます。

暗黙的な参照解決

前回.が暗黙的な参照解決を行うという話をしましたが、[]によるスライスへのアクセスも同様です。

let v = [1,3,4];
let vp = &v;
println!("{}", vp[0]); //println!("{}", (*vp)[0]);と書いても同様
1

クロージャ

関数を代入できるやつです。詳しくは後ほど出てくるらしい。

let is_even = |x| x % 2 == 0;
assert_eq!(is_even(4), true)

続く

短いですが、基礎ばっかりやっていても仕方ないのでそろそろもの作りしたいですね。ネットワークプログラミングしたいです。