クロージャって何?とWikipediaで調べると
「クロージャ(クロージャー、英語: closure)、関数閉包はプログラミング言語における関数オブジェクトの一種。」
となっていました。Wikipediaより
「引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。」とあります。
ようするに下記のようなロジックで関数オブジェクトfunc1,func2はそれぞれ独立したスコープをもっているのでcount変数の値は各自で違うことになります。
fun main(args: Array<String>) {
// countUp()内で宣言した変数 count の値を +1 する「関数オブジェクト(クロージャ)」を返す。
fun countUp(): () -> Unit {
var count = 0
return {
count++
println(count)
}
}
//関数を変数保持
var func1 = countUp()
var func2 = countUp()
func1()//1
func1()//2
func2()//1
func2()//2
func2()//3
}
[実行結果]
count = 1
count = 2
count = 1
count = 2
count = 3
func1とfunc2それぞれのスコープでカウントアップされていることがわかります。