はじめに
つい先日kotlinを勉強し始めたのですが、関数の引数に関数を渡す例はいっぱいあるからわかる!
けど、関数を戻り値として扱う例は見つからずに、どうしたらいいんだろうと色々探し回ってました・・・
探し方が悪かったのか結構苦労したので、すごいピンポイントですが記事にしました。
関数の戻り値として関数を渡す
早速、結論を言うと以下の感じで書けば大丈夫なようです。
fun 関数名(引数): (戻り値として返す関数の引数) -> (戻り値として返す関数の戻り値の型) {
// なんかの処理
return 戻り値の関数
}
引数として関数を指定する方法と同様の表記を、関数の戻り値型の位置で指定すれば良いようです。
サンプル
せっかくなので関数の引数に関数を渡す例としてクロージャのサンプルを作ってみました。
fun functionGenerator(outerStr: String) : (innerStr: String) -> Unit {
val outer = outerStr
return fun (innerString){
println("outer value : $outer")
println("inner value : $innerString")
}
}
fun main() {
val funInstance = functionGenerator("this is outer function arg")
funInstance("this is inner function arg")
functionGenerator("outer func")("inner func")
}
関数の戻り値の型指定は(innerStr: String) -> Unit
の部分です。
functionGeneratorの戻り値はString型のinnerStrを受け取って、戻り値なしの関数と言う意味ですね。
実際の戻り値は、return fun(innerString)
で関数を作っています。
main側ではfunctionGeneratorを呼び出してfunInstance
で関数を受け取って実行します。
val funInstance = functionGenerator("this is outer function arg")
funInstance("this is inner function arg")
また、一回しか使わないのであればfunctionGeneratorで戻ってきた関数を即時実行することもできます。
functionGenerator("outer func")("inner func")
終わりに
関数の戻り値型の指定に、引数として関数を指定する方法と同様の表記() -> ()
すればいいだけでした・・・
同じところでつまづいた方のお力になれればいいなぁと思います。