クロージャって (Scala)

クロージャって、Rubyでも知らない間に使っていたみたい。
こういうのをいうんだ。
単純に、Rubyのブロックは、その外の変数にもアクセスできるという風に、理解していたけど、
そういうの(ブロック)をクロージャ(関数)っていうんだな。
関数に、自由束縛の変数があると、それは、記述にしたがって(静的に)、外の変数にアクセスできるっていうイメージか。
(下の例だと、varを推奨するみたいで、関数型としてはどうなのかとも思うが。)


object test {
def main(args : Array[String]):Unit= {
var i = 1
def closure_test = {
i = i + 1
}
closure_test
println(i) // i が2になっている。
}
}


こういう例も、実はクロージャで実現されているのかな?
なんとなく、同じ階層に書いてると、ほかの関数も使えるという風に考えていたけど、関数型では、これもクロージャってことかな。
object test2 {
def main(args : Array[String]):Unit= {
def judge2(a:Int) = if (a>2) true else false
def select2( list:List[Int] ):List[Int] = {
val judged_list:List[Int] = list.filter(judge2)
return judged_list
}
println( select2( List(0,1,2,3,4,5) ) )
}
}


えっと、これらは、ローカル関数(関数の中の関数定義)だけど、
メソッドではどうなるのかな。とくにはじめの例。
object test {
var i = 1
def main(args : Array[String]):Unit= {
closure_test
println(i)
closure_test
println(i)
}
def closure_test = {
i = i + 1
}
}


メソッド(クラス・オブジェクトのメンバ関数)でも、同じか。