記事が参考になりそうな人
- ラムダがよくわからんくなる人
変数に関数を格納する
fun foo(){
println("Hello")
}
を変数に格納したいときは(関数を呼び出すんではない)
val aaa = ::foo
funを使わず関数をつくる
"fun"を使わずに関数を定義するには
val foo = { println("Hello")}
これは
foo()
で関数を呼べる
関数「型」
() -> Unit
とは、
「引数がない」し、「戻り値がない」関数"型"を表している
(Intとかの型と同じように、関数の型を書きたいときはこれ)
応用
Int型2つの引数を受け取り、Int型が返ってくる関数は
(Int, Int) -> Int
つまり、例えば
val aaa:() -> Unit = {println("Hello")}
は
「aaa は引数なしの戻り値なしの関数のことですよ」で、
val cat:String = "猫"
と同じ見方
まとめるとこんな風に書ける
fun main() {
val trueFunction = trickOrTreat(true)
val falseFunction = trickOrTreat(false)
trueFunction()
falseFunction()
}
fun trickOrTreat(isTrick:Boolean):()->Unit{
if(isTrick){
return trick
}else{
return treat
}
}
val trick = {println("trick")}
val treat = {println("treat")}
trick
treat
が返ってくる
引数に関数型を設定する
上のtrickOrTreat関数の引数を増やすと
fun trickOrTreat(isTrick:Boolean, extraTreat:(Int)->String):()->Unit{
if(isTrick){
return trick
}else{
println(extraTreat(5))
return treat()
}
}
訳:
trickOrTreatの第2引数が関数で、その関数っていうのはInt型を引数に持ってて、Stringが返ってくる
で、treat関数の引数にそのstringをつっこもう
(extraTreatって名前はここで付けた名前ってだけで、そういう名前の関数を用意しろ、もしくは絶対存在してるってことではない)
val coins:(Int) -> String = { number->
"$number coins"
}
とかてきとーにつくってtrickOrTreat関数の第2引数としてつっこめばよい
fun main() {
val coins:(Int)->String = { int ->
"$int coins"
}
val cupcake:(Int)->String = {
"cupcake"
}
val trueFunction = trickOrTreat(true, coins)
val falseFunction = trickOrTreat(false, cupcake)
trueFunction()
falseFunction()
}
fun trickOrTreat(isTrick:Boolean, extraTreat:(Int)->String):()->Unit{
if(isTrick){
return trick
}else{
println(extraTreat(5))
return treat
}
簡単に書く
上の書き方をもっと簡単にしよう
まず
val coins:(Int)->String = { int ->
"$int coins"
}
は、{}の中の"int"って明示的に書いたけど、別にわざわざ書かなくても良い→その場合はitになる
val coins:(Int)->String = {
"$it coins"
}
次に、coinsって1回しか使われてないから直でつっこみたいな
これが
val trueFunction = trickOrTreat(true, coins)
こうなる
val trueFunction = trickOrTreat(true, {$it coins})
最後の引数が関数型ならその関数型を外に出せる
trickOrTreat関数みたいに、引数の最後が関数型なら外に出せる
val trueFunction = trickOrTreat(true){$it coins}
参考