高階関数(クロージャ)

クロージャって何?と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それぞれのスコープでカウントアップされていることがわかります。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする