Луа "требуют" с глобальным "местным"? - PullRequest
6 голосов
/ 05 июля 2011

Очевидно, что я немного перепутал, но я понял, что используя что-то вроде этого в "main.lua":

local module = require("module")
local var = "I should be global?"
printthis()

с module.lua, содержащим что-то вроде:

function printthis()
    print(var)
end

, что printthis(var) будет работать нормально, потому что теперь код module.lua внутри main.lua, нет? Вместо этого printthis не знает, что такое var. Я читал, что это хорошая практика, когда это возможно, использовать "local" для переменных Lua, но в этом случае нужно ли сделать var глобальным или есть ли способ для функции printthis() модуля module.lua правильно читать var?

Ответы [ 3 ]

23 голосов
/ 05 июля 2011

Нет.Это совсем не так.

Интерпретатор Lua предоставляет одну глобальную таблицу, обычно называемую _G, если вы не делаете что-то странное.

function printthis()
    print(var)
end

В действительности это означает

_G.printthis = function()
    _G.print(_G.var);
end

И ваш код в main равен

local module = _G.require("module")
local var = "I should be global?"
_G.printthis()

Но когда вы звоните printthis - где же был установлен _G.var?Нигде.Таким образом, переменная равна nil, как и все другие обращения к таблице, где нет ничего по этому ключу.

Это может быть неудобно, но это - намного лучшая идея в долгосрочной перспективе, чтобы пройтиаргументы, чем устанавливать глобальные переменные вместо.Как только вы придете, чтобы что-то изменить в программе, совершенно невозможно будет внести какие-либо изменения, так как логика не имеет структуры, и вы не представляете, что происходит, не читая каждую строку кода и не понимая ее сразу.Кроме того, вы можете использовать каждый ключ только в одном месте, потому что это глобальная таблица, так что я надеюсь, что никто не хотел использовать «var» в качестве имени переменной, и вы не возражаете против того, чтобы ваш код молча провалился, потому что вы получили глобальнуюимя неверное.

4 голосов
/ 08 июля 2011

В двух других ответах затенена важная вещь: лексическая область видимости.

Это примерно означает, что код может получить доступ к локальным переменным, которые определены там, где определен код.Возможно, это звучит расплывчато, поэтому я приведу пример:

local cheese = 'sandwich'
print(cheese) -- prints sandwich
do -- this begins an anonymous block
    local cheese = 22
    print(cheese) -- prints 22
end
print(cheese) -- prints sandwich

Итак, у нас есть две разные переменные: внешняя "затенена" внутренней.

Теперь на функции:

do
    local hotdog = 'hot'
    function nonsense()
        print(hotdog)
    end
end
print(hotdog) -- prints nil, since there is no variable called hotdog here
nonsense() -- prints hot

Функции могут видеть локальные переменные с того места, где они определены , а не с того места, где они вызываются.Это очень важно и очень полезно, когда вы освоитесь.

1 голос
/ 05 июля 2011

Я не эксперт в lua, но нельзя var передавать как переменную. Как то так:

function printthis(var)
    print(var)
end

Вам не хватает вашего var в заголовке функции. И вы передаете var in main.lua в качестве аргумента printthis() функции.

...