2

2 つのクロージャがアップバリューをどのように共有するのか? そして、それはどのように機能しますか?

function print_env()
  print(_ENV) --_ENV is an upvalue
end

function foo()
  _ENV = { print = print, print_env = print_env} --redefine the _ENV upvalue
  print(_ENV) --prints: 0094CF40
  print_env() --prints: 0094CF40
end

print_env()それから呼び出すと、定義された in がfoo()出力されますが、それらは異なる関数であるため、クロージャの上位値が異なるべきではありませんか? したがって、一方の関数がその上位値を変更しても、もう一方は同じままです。それとも特別なアップバリューですか?_ENVfoo()_ENV

ありがとう

4

1 に答える 1

1

アップバリューは外部ローカル変数です。2 つの関数が同じ外部ローカル変数を使用する場合、上位値を共有できます。これは字句スコープによって決定されます。さらに、すべてのチャンクは、_ENVグローバル名の解決に使用される という名前の外部ローカル変数を認識します。

于 2013-07-26T11:13:05.690 に答える