Rustのクロージャ
無名関数とかlambda式に似てる
高速で安全らしい
code:closures.rs
fn main() {
let a = |arg| {
println!("{:?}", arg);
arg
};
let hoge = "Hoge";
println!("{}", a(hoge));
}
クロージャ内の変数は外で使用されている変数を借用する機能を持っている
※クロージャ内で定義されていない場合
code:closures-borrow.rs
fn main() {
let a = 12;
let clo = || {
println!("{}", a);
};
clo();
println!("{}", a);
}
※比較用
code:closures-borrow-comparison.rs
fn main() {
let a = 12;
let clo = || {
let a = 14;
println!("{}", a);
};
clo();
println!("{}", a);
}
所有権を持っていきたい場合は前にmoveをつける
code:closures-move.rs
fn main() {
let a = String::from("Hi owner!");
let clo = move || {
println!("{}", a);
};
clo();
// ↓はクロージャにaの所有権が移動してなくなったため、これはエラーになる
// ※コメントを外して試してみて
// println!("{}", a);
}
1回目にクロージャで使用した型に合わせなければいけない
例:String型を1回目のクロージャで使用し、2回目のクロージャをisize型で使おうとした→エラー(コンパイルエラー)
code:closures-must-same-type.rs
fn main() {
let a = String::from("Hi owner!");
let clo = |x| {
println!("{}", x);
};
clo(a);
let b: isize = 12;
clo(b); // これはエラーになる
}