2012-05-18 5 views
3

Я знаю, что есть другие подобные темы, но я не смог найти прямой ответ на мой вопрос.lua variables scope

Предположим, у вас есть такая функция, как:

function aFunction() 
    local aLuaTable = {} 
    if (something) then 
    aLuaTable = {} 
    end 
end 

Для aLuaTable переменной внутри, если заявление, он по-прежнему местный право ?. В основном, я спрашиваю, если я впервые определяю переменную как локальную, а затем я использую ее снова и снова, любое количество раз будет оставаться локальным для остальной части жизни программы, как это работает именно ?.

Кроме того, я прочитал это определение для глобальных переменных Lua:

Любая переменная не в определенном блоке, как говорят, в глобальном масштабе. Все, что доступно в глобальном масштабе, доступно для всех внутренних областей.

Что это означает не в определенном блоке ?, я понимаю, что если я «объявляю» переменную в любом месте, она всегда будет глобальной, это неверно ?.

Извините, если вопросы слишком просты, но из Java и объектива-c, lua очень странно для меня.

+0

У меня не было много XP с lua, но насколько я знаю, переменная будет в пределах видимости внутри этой функции - она ​​выходит за рамки вне функции. Любые переменные, объявленные вне тела функции (определенный блок), считаются находящимися в глобальной области видимости и доступны из любого места в этом сценарии lua. – Charleh

ответ

8

«Любая переменная, не содержащаяся в определенном блоке, считается глобальной областью».

Это просто неправильно, поэтому ваше замешательство понятно. Похоже, вы получили это из пользовательской вики. Я только что обновил страницу с информацией о коррекции:

Любая переменная, которая не определена как local, является глобальной.

я понимаю, что если я «объявить» переменную в любом месте всегда будет глобальным

Если вы не определили его как local, оно будет глобальным. Однако, если вы затем создадите local с тем же именем, он будет иметь приоритет над глобальным (то есть Lua «видит» локали сначала при попытке разрешить имя переменной). См. Пример внизу этой публикации.

Если я определяю переменную как локальную в первый раз, а затем я снова и снова использовать его любое количество раз он будет оставаться локальным для остальной жизни программы, , как именно это работает?

Когда ваш код скомпилирован, Lua отслеживает любые локальные переменные, которые вы определяете, и знает, какие из них доступны в заданной области. Всякий раз, когда вы читаете/записываете переменную, если в ней есть локальная область с этим именем, она используется. Если этого не происходит, чтение/запись переводится (во время компиляции) в таблицу чтения/записи (через таблицу _ENV).

local x = 10 -- stored in a VM register (a C array) 
y = 20  -- translated to _ENV["y"] = 20 

x = 20  -- writes to the VM register associated with x 
y = 30  -- translated to _ENV["y"] = 30 

print(x)  -- reads from the VM register 
print(y)  -- translated to print(_ENV["y"]) 

Местные жители лексически ограничены. Все остальное идет в _ENV.

x = 999 

do -- create a new scope 
    local x = 2 
    print(x)  -- uses the local x, so we print 2 
    x = 3   -- writing to the same local 
    print(_ENV.x) -- explicitly reference the global x our local x is hiding 
end 

print(x) -- 999 
+2

Просто обратите внимание, что '_ENV' является только Lua 5.2. В Lua 5.1 (и до) глобальные значения хранятся в '_G' (на самом деле это немного сложнее, вы можете изменить среду функции и т. Д.). –

+2

Я считал упоминанием _G (которое является глобальным состоянием в 5.1 и значением по умолчанию для _ENV в 5.2), но я подумал, что это просто сбивает с толку. 5.2 - последняя версия, поэтому я пошел с _ENV. Вся информация о области та же, за исключением того, что в 5.1 ссылки на _ENV будут _G-ссылками. – Mud

2

Для переменной aLuaTable внутри оператора if это по-прежнему локально право?

Я не понимаю, как вы здесь смущены; правило такое же, как и для Java. Переменная все еще находится в пределах видимости, поэтому она продолжает существовать.

A local переменная является эквивалентом определения переменной «стек» в Java. Переменная существует в пределах области блока, которая ее определяла, и перестает существовать, когда заканчивается этот блок.

Рассмотрим Java-код:

public static void main() 
{ 
    if(...) 
    { 
    int aVar = 5; //aVar exists. 
    if(...) 
    { 
     aVar = 10; //aVar continues to exist. 
    } 
    } 

    aVar = 20; //compile error: aVar stopped existing at the } 
} 

А "глобальный" это просто любое имя переменной, которая не местные. Рассмотрим эквивалентный код Lua к вышесказанному:

function MyFuncName() 
    if(...) then 
    local aVar = 5 --aVar exists and is a local variable. 

    if(...) then 
     aVar = 10 --Since the most recent declaration of the symbol `aVar` in scope 
       --is a `local`, this use of `aVar` refers to the `local` defined above. 
    end 
    end 

    aVar = 20 --The previous `local aVar` is *not in scope*. That scope ended with 
      --the above `end`. Therefore, this `aVar` refers to the *global* aVar. 
end 

Что в Java будет ошибка компиляции совершенно правильный код Lua, хотя это, вероятно, не то, что вы хотели.