_ENV的Lua奇怪行为

时间:2018-11-24 11:24:07

标签: lua

有人可以解释为什么lua 5.3.5如此行事吗?

a="global"
local b="local"

function problem(_ENV)
    a="fn_a"
    b="fn_b"
end

problem{}
print(_VERSION)
print("a",a)
print("b",b)

--[[ https://www.lua.org/cgi-bin/demo output:
Lua 5.3
a       global
b       fn_b
]]

为什么_ENV更改后可以更改局部变量?是错误还是功能?

2 个答案:

答案 0 :(得分:1)

问::如何消除所有升值?
A:

[attr.pattern]="'([0-9]{3}) [0-9]{3}-[0-9]{4}'"

答案 1 :(得分:0)

您正在使用以下代码创建upvalue

local b="local"
function problem(_ENV)
    b="fn_b"
end

在解析函数解释器的过程中,该函数引用了一个局部范围内的局部变量,该局部范围从函数内部可见,因此可以将其直接链接起来。在_ENV中,对局部变量的访问先于全局变量的查找。如果将local b="local"放在函数定义之后,则不会被函数调用更改。