3

次の質問について: http://pastie.org/4825115、ここに私のコードがあります: http://pastie.org/private/n22zohyshn2ymqrbrb3g

def randList(len: Int, n: Int): List[Int] = len match {
  case 0 => List()
  case len => scala.util.Random.nextInt(n) :: randList(len-1, n)
}

しかし、randList がクロージャーと呼ばれる理由がわかりません。

4

3 に答える 3

19

私の理解によると、これrandListは間違いなくクロージャではありません (ウィキペディアは同意しているようです)。これは、提供したコードのスニペットでは、ローカル変数にのみ依存するためです (パラメーターもローカル変数と見なされます)。の本体を考えると、randListいわゆる自由変数、つまり現在の字句スコープから値を取得しない変数はありません。後者はメソッド本体そのものです。lennは両方とも、 の囲み定義のパラメータであるため、現在のレキシカル スコープの変数ですrandList

次の例を検討してください。

var n = 10
val f = (x: Int) => x + n

println(f(1)) // 11

n = 20
println(f(1)) // 21

この関数fは、そのパラメーターだけでなく、独自のレキシカル スコープ (つまり ) の外で宣言された変数にも依存するため、クロージャーですn

ウィキペディアの記事では、自由な引数を宣言するレキシカル スコープと共に関数によってクロージャが定義されると述べています。次の例はこれを示しています。

// n == 20
// f as above

def foo(g: Int => Int) = {
  val n = 100
  g(1)
}

println(foo(f)) // 21

の結果foo(f)はまだ独自のローカル変数を定義して21いますが、今は this を使用していると思われるかもしれません。ただし、クロージャーは、その宣言を囲むレキシカルスコープに結合されています。これは、が評価されるときにの値が取得される場所です。foonfnfnf

于 2012-09-27T07:07:15.060 に答える
-1

私の理解では、クロージャーは別の関数の状態を参照できる関数です。詳細については、このスレッドを参照してください: What is a 'Closure'? .

この問題では、randList外部変数を参照していないため、クロージャーではありません...

于 2012-09-27T06:26:22.637 に答える