第65回です。前回はこちら。
[第65回の様子]
2023/02/01に第65回を開催した。
内容としてはRust By Example 日本語版19. 標準ライブラリの型の「19.4. Option」に取り組んだ。
参加者は自分を入れて確か5人。今日は初めて勉強会に参加してくれたメンバーがいて、厚かましくもドライバーをお願いしてしまった。
[学んだこと]
- 19.4. Option
- panic!するよりもエラーをキャッチする方がいいよね、ということでOptionの説明を見ていく
- ドライバがRust初めてだったので、panic!の説明を改めて読んだ
- プログラムを終了してくれるやつ
- OptionはNoneまたはSome(T)のenum(列挙型)
- 例として割り算を行うコードを見ていく
// `panic!`を起こさない整数の割り算
fn checked_division(dividend: i32, divisor: i32) -> Option<i32> {
if divisor == 0 {
// 失敗は`None`
None
} else {
// 結果は`Some`でラップ
Some(dividend / divisor)
}
}
// この関数は失敗する割り算を扱うことができる
fn try_division(dividend: i32, divisor: i32) {
// `Option` は、パターンマッチに使用できる
match checked_division(dividend, divisor) {
None => println!("{} / {} failed!", dividend, divisor),
Some(quotient) => {
println!("{} / {} = {}", dividend, divisor, quotient)
},
}
}
fn main() {
try_division(4, 2); // 4 / 2 = 2
try_division(1, 0); // 1 / 0 failed!
}
- Option型の変数を宣言し利用する場合は次のようにする
- 値を取得する場合はunwrap()メソッドを利用する
// 型はOption<f32>となる
let optional_float = Some(0f32);
println!("{:?} unwraps to {:?}", optional_float, optional_float.unwrap());
// Some(0.0) unwraps to 0.0
- 久々なのでデフォルトの浮動小数点型がf64なのを忘れていた
//上記コードを以下のように書くと挙動は一緒だが利用するメモリ量が32ビットから64ビットに増えてしまうことになる
let optional_float = Some(0.0); // Option<f64>
println!("{:?} unwraps to {:?}", optional_float, optional_float.unwrap());
// Some(0.0) unwraps to 0.0
- ただ、コンピュータ的には32ビットの浮動小数点(float)よりも64ビット(double)の方が速いらしい
- 確かによっぽどのケースでない限りはメモリは気にならないかも
- 途中で詳しい人がfloatの方が速いケースもあるみたいな説明をしてくれた気もするがちゃんと理解できなかったorz
- Noneをunwrap()しようとするとパニックする
- ので、先ほどの
try_division()関数のようにmatch文などで処理を分ける必要がある
- ので、先ほどの
let none: Option<i32> = None;
let _equivalent_none = None::<i32>;
println!("{:?} unwraps to {:?}", none, none.unwrap());
// thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:45:49
[まとめ]
モブプログラミングスタイルでRust dojoを開催した。
Optionわかるわかる、と油断しているとデフォルトの数値型とか忘れていて、プログラムの動作を説明できない部分がある。精進せねば。
今週のプルリクエストはこちら。