С Lua кодом кусок, как это:Как upvalues подсчитываются в вложенных функциях Lua?
local a, b
function fA()
print(a)
function fB()
print(b)
end
end
Сколько upvalues фА точно есть, 1 или 2?
С Lua кодом кусок, как это:Как upvalues подсчитываются в вложенных функциях Lua?
local a, b
function fA()
print(a)
function fB()
print(b)
end
end
Сколько upvalues фА точно есть, 1 или 2?
По определению все внешние локальные переменные, используемые в функции, считаются значениями upvalues. Как уже упоминалось, в Lua 5.2 есть также скрытое значение up для среды, если функция использует глобальные переменные.
Возможно, вы захотите прочитать байт-код, сгенерированный для вашего кода, с помощью luac -l -l
.
Что может вас смутить, так это определение fB
в теле fA
. Напомним, что function fB() print(b) end
- это просто сахар для fB = function() print(b) end
. Когда вы это сделаете, ясно, что b
используется в fA
, а также что вы назначаете глобальную переменную fB
. Следовательно, вы получаете 3 upvalues за fA
в Lua 5.2. (Использование print
также подразумевает, что fA
использует глобальные переменные.) Если вы используете local function fB ...
и удалите print
, вы увидите, что fA
использует 2 upvalues как в 5.1, так и в 5.2.
Реализация определена; это может быть один или два. Или три (одно значение для окружающей среды). Вы не знаете, и вы должны никогда должны заботиться.