Lua странное поведение с _ENV - PullRequest
0 голосов
/ 24 ноября 2018

Кто-нибудь может объяснить, почему 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 голосов
/ 25 ноября 2018

Q: Как устранить все значения?
A:

a="global"
local b="local"

-- load() actually eliminates all upvalues :-)
no_problem = assert(load[[
    return function (_ENV)
        a="fn_a"
        b="fn_b"
    end
]])()

no_problem{}
print(_VERSION)
print("a",a)  -->  a    global
print("b",b)  -->  b    local
0 голосов
/ 24 ноября 2018

Вы создаете значение до со следующим кодом:

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

Во время синтаксического анализа интерпретатор функции обнаруживает, что эта функция ссылается на локальную переменную из одной из охватывающих областей, видимых извнутри функции и, таким образом, связывает ее напрямую.Доступ к локальным переменным предшествует поиску глобальных переменных в _ENV.Если вы поставите local b="local" после определения функции, она не будет изменена при вызове функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...