[過去ログ] Rust part24 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
567: デフォルトの名無しさん [sage] 2024/07/02(火) 18:32:06.29 ID:0AnHLV8o(1/2) AAS
>>559559(2): デフォルトの名無しさん [sage] 2024/07/02(火) 10:27:11.96 ID:LnXo4/R2(1/2) AAS
>>538
result.and_then(|val| Ok(f(val)?))
とか
result.and_then(|val| Ok(f(val).unwrap()))
じゃなくて
result.and_then(|val| Ok(f(val)))
で良いのはなぜ?
Rustでそれらは全てmatchになるので置き換えて比較すれば理解は簡単
ちなみにmatchにすると記述が長くなるが同レベルで「?」オペレータ適用できるメリットがある
result.and_then(|val| f(val))
これはこう置き換えられる
match result {
Ok(val) => f(val),
Err(err) => Err(err),
}
result.map(|val| f(val))
これはこう置き換えられる
match result {
Ok(val) => Ok(f(val)),
Err(err) => Err(err),
}
つまり常にこれが成り立つ
>>534534(3): デフォルトの名無しさん [sage] 2024/07/01(月) 12:59:53.25 ID:irzLgX5l(1) AAS
>>525
こう書くとresultがErrの時に返せずここでpanicになってしまう
let val = result.unwrap();
f(val)
そのためpanicしてもいいとか絶対にErrとならない特殊な場合を除けば
unwrapを用いてはダメでmapを使ってこのように書くんだよ
result.map(|val| f(val))
ここで本当に関数fを呼ぶだけならresult.map(f)と簡略化できるけど
f(val)の部分は式やブロックの可能性もあるので簡略化せずに進めるね
これは以下と同等でErr(err)の時に保持してくれている
match result {
Ok(val) => Ok(f(val)),
Err(err) => Err(err),
}
ちなみにf(val)もResultを返すときは
mapの代わりにand_thenがある
result.and_then(|val| f(val))
つまり以下の二つは同等
result.map(|val| f(val))
result.and_then(|val| Ok(f(val)))
この場合はもちろん簡素なmapを用いるべき
> 以下の二つは同等
> result.map(|val| f(val))
> result.and_then(|val| Ok(f(val)))
568: デフォルトの名無しさん [sage] 2024/07/02(火) 18:34:46.10 ID:0AnHLV8o(2/2) AAS
>>565SlintはGUI部分だけ専用スクリプトで宣言して
プログラムはRustでもC++でもJavaScriptでも記述できる
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.043s