KotlinのResult型の存在を知ったので、勉強メモ
公式はこちら
Result型とは
Kotlin1.3からstdlibに登場した型です
RustやScalaにも同じ名前の方がありますが、Kotlinのものは特殊で、メソッドの戻り値にすることができないという特徴があります
したがって、「例外を返すかもしれないからなんとかして!」というメッセージをメソッド間で伝える、という使い方はできません[^reason]
例えば、Rustではこんな使い方ができます
Result型を使えば、呼び出し元にエラーハンドリングを強制できます
/**
* 引数が偶数ならば2で割った数、奇数ならばエラーを返す
*/
fn devideBy2(x: i32) -> Result<i32,&'static str> {
if x % 2 == 0 {
Ok(x / 2)
} else {
Err("error message")
}
}
fn main() {
let x = // 何かしら代入
match devideBy2(x) {
Ok(result) => println!("number: {}", result),
Err(msg) => println!("error: {}", msg),
}
}
残念ながらKotlinではこのような使い方ができません
理由は、将来の拡張でResultのセマンティックが変わる可能性が高いからだそうです。ぜひ早く対応して欲しいですね!
...が、なんとList>など、単なるResult型でなければ関数の返り値にすることができます
失敗したやつを呼び出し元でまとめて処理したい場合に使えます
他にも
- 非同期処理のコールバックの引数
- 関数内で失敗時の処理を強制する
などのユースケースがあるようです