Lua 什么是共享价值观?

Lua 什么是共享价值观?,lua,upvalue,Lua,Upvalue,两个闭包如何共享一个upvalue?它是如何工作的 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

两个闭包如何共享一个upvalue?它是如何工作的

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
当我从
foo()
调用
print_env()
时,它会打印
foo()
中定义的
_env
,但是,由于它们是不同的函数,它们的闭包不应该有不同的upvalue吗?因此,当一个函数修改其upvalue时,另一个函数保持不变。或者
\u ENV
是一个特殊的upvalue


谢谢,Upvalues是外部局部变量。当两个函数使用相同的外部局部变量时,它们可以共享upvalue。这是由词汇范围决定的。此外,每个块都会看到一个名为
\u ENV
的外部局部变量,用于解析全局名称

对我来说,
foo()
打印两行相同的代码。所有三次出现的
\u ENV
都引用了相同的upvalue。@EgorSkriptunoff我试图使用dofile运行代码,但它在两个函数中使用了相同的upvalue。但为什么会发生这种情况呢?我认为,在这种情况下,ENV是chunk的upvalue,而不是函数的upvalue_环境=。。。与_G._ENV=。。。您可以执行本地_ENV=。。。为某个函数创建upvalue。为什么不同的函数应该有不同的upvalue?这取决于词汇范围。