fun useClosure2(x: Int): (Int) -> Int {
// x = 100(200) のままで使われる.
// 変数 z/zz に、保存されている.
// 変数num の、値も、同様に、変数 z/zz に、保存されている!
var num = 0
/* val useFun: (Int) -> Int = fun(y: Int): Int {
return x + y + (++num * ++num)
}
*/
// val useFun = {y: Int -> x + y + (++num * ++ num)}
// IntelliJ が、inlineにして欲しいというので、考えました。
// 多分、コピーすると、それが、オーバーヘッド になり、実行速度が落ちる ということ?
return { y: Int -> x + y + (++num * ++num) }
}
fun main() {
// z は、useFun(y : Int) の、y: Int を、使うが、
// あくまで、useClosure(100) である.
val z = useClosure2(100)
println(z(6)) // num: 1, 2 -> 100 + 6 + 2
println(z(7)) // num: 3, 4 -> 100 + 7 + 12
println(z(8)) // num: 5, 6 -> 100 + 8 + 30
println("")
val zz = useClosure2(200)
println(zz(6))
println(zz(7))
println(zz(8))
}
/*
108
119
138
208
219
238
*/