昨日に引き続き型をみていく。

クロージャ

|x| x + 2

みたいなやつ。Pythonでいうところのlambda式だろう。引数に受け取った値以外にも環境にある値を使えるらしい。さらに言えば変更できる。

let x = 4;

let adder = |n| n + x;
adder(2)

とか

let mut state = false;
let mut flipflop = || {
	state = !state;
	state
}

flipflop();

とかができる。なお、evcxr環境では動かなかった。クロージャはその場で新しい型を定義しているため再代入はできないらしい。

複合型

タプル

Pythonのタプルに似ていろいろな型の値を混ぜて入れられる。要素数もコンパイル時に決まるため後から変更できない点も同じ。パターンマッチというのがアンパック代入に似ている

let (n1, b1) = (88, true);

println!("{} {}", n1, b1); // => 88 true

Pythonと違う点は以下の点。

let t1 = (88, true);

t1.0 // => 88
let mut t2 = (88, false);

t2.1 = true;
t2 // => (88, true)