クロージャってなんかカッコいい響き・・・!
Wikipedia先生!クロージャってなんですか?
せ、先生・・・
先生!わかりません!
とりあえず書いてみよう。
んで実行してみる。
おおおおおお!!!
ここでいうとfoo()がエンクロージャってことになるのか。
foo()は内部で作った無名関数を返す高階関数。
返される無名関数は、foo()で宣言されたxに1を足して返す。
ポイントは無名関数が関数外部にあるxにアクセスできるってところと、
そのxはfoo()が呼び出しによって定義されてそれが静的スコープとして保存されるってこと。
なのでbar()を何度も呼び出すと、返されるxの値は1ずつ増えていくけど、
新しくfoo()を実行してbar()を定義すると初期化される。
ということはこういう使い方もできそうだ。
レキシカル変数をエンクロージャの引数として初期化して使える。
JSにもRubyにもPerlにもクロージャの機構があるのか・・・
DIがJavaでしかはやってないのもわかる気がする・・
そもそもInterfaceとImplementが一対で、Logicクラスインスタンス生成時にDaoクラスをインジェクションするみたいなアホみたいに冗長な書き方はクロージャで解決できるもんね。
かっけーなー
Wikipedia先生!クロージャってなんですか?
クロージャ
プログラミング言語において、クロージャ (クロージャー、Closure) は関数の一種である。引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決する。
せ、先生・・・
典型的には、クロージャはある関数全体が他の関数(以下、エンクロージャ)の内部で宣言されたときに発生し、内部の関数はエンクロージャのローカル変数(レキシカル変数)を参照する。実行時に外部の関数が実行された際、クロージャが形成される。クロージャは内部の関数のコードとエンクロージャのスコープ内の必要なすべての変数への参照からなる。
クロージャはプログラム内で環境を共有するための仕組みである。レキシカル変数はグローバルな名前空間を占有しないという点でグローバル変数とは異なっている。またオブジェクトのインスタンス変数とは、オブジェクトのインスタンスではなく関数の呼び出しに束縛されているという点で異なる。
クロージャは関数型言語では遅延評価やカプセル化のために、また高階関数の引数として広く用いられる。
先生!わかりません!
とりあえず書いてみよう。
scala> def foo() = {
| var x = 0
| () => {
| x += 1
| x
| }
| }
foo: ()() => Intんで実行してみる。
scala> var bar = foo()
bar: () => Int = <function>
scala> bar()
res5: Int = 1
scala> bar()
res6: Int = 2
scala> bar()
res7: Int = 3
scala> var bar = foo()
bar: () => Int = <function>
scala> bar()
res8: Int = 1
おおおおおお!!!
ここでいうとfoo()がエンクロージャってことになるのか。
foo()は内部で作った無名関数を返す高階関数。
返される無名関数は、foo()で宣言されたxに1を足して返す。
ポイントは無名関数が関数外部にあるxにアクセスできるってところと、
そのxはfoo()が呼び出しによって定義されてそれが静的スコープとして保存されるってこと。
なのでbar()を何度も呼び出すと、返されるxの値は1ずつ増えていくけど、
新しくfoo()を実行してbar()を定義すると初期化される。
ということはこういう使い方もできそうだ。
scala> def foo(x:Int) = {
| (y:Int) => {
| x * y
| }
| }
foo: (Int)(Int) => Int
scala> val bar = foo(10)
bar: (Int) => Int = <function>
scala> bar(8)
res9: Int = 80
scala> bar(7)
res10: Int = 70
scala> val bar = foo(5)
bar: (Int) => Int = <function>
scala> bar(8)
res11: Int = 40
scala> bar(7)
res12: Int = 35レキシカル変数をエンクロージャの引数として初期化して使える。
JSにもRubyにもPerlにもクロージャの機構があるのか・・・
DIがJavaでしかはやってないのもわかる気がする・・
そもそもInterfaceとImplementが一対で、Logicクラスインスタンス生成時にDaoクラスをインジェクションするみたいなアホみたいに冗長な書き方はクロージャで解決できるもんね。
かっけーなー