Область действия переменной Lua, объявление функции forward и рефакторинг сценария Lua с помощью оператора require - PullRequest
1 голос
/ 10 февраля 2011

Я нахожу правила обзора Луа немного запутанными. Ниже я представил фрагмент сценария Lua, чтобы выделить проблемы, о которых я хочу задать вопрос (ы):

-- 'forward definitions'
-- could these be moved to the bottom of the script to 'tidy up' the script?
-- could these reside in another file imported by require 'filename' to tidy up the script even more?

[[ Note: This function is accessing variables defined later on/elsewhere in the script
         and is also setting a variable (flag) which is then used elsewhere in the script
]]

function war_is_needed()
    if (goodwill:extendsToAllMen() and peace) then
        if player:isAppointedLeader() then
           economy_is_booming = false
           return true
        else
           economy_is_booming = nil
           return true
        end           
    else
        economy_is_booming = nil
        return false
    end
end



world = WorldFactory:new('rock#3')
player = PlayerFactory:getUser('barney', world)

while (not player:isDead()) do
    peace = world:hasPeace()
    goodwill = world:getGoodwillInfo()

    if war_is_needed() then
       world:goToWar()
    else
       if (not economy_is_booming) then
           player:setNervousState(true)
           player:tryToStartAWar()
       else
           player:setNervousState(false)
           player:liveFrivously()
       end if
    end   
end

Мои вопросы (на данный момент игнорируя, что глобальные переменные МОГУТ считаться злыми):

  • Может ли функция в верхней части сценария быть перемещена в нижнюю часть сценария, чтобы "привести в порядок" сценарий?
  • Может ли функция в верхней части скрипта быть реорганизована (т.е. перемещена) в отдельный файл 'warfuncs.lua', а затем импортирована в скрипт, заменив определение функции требованием 'warfuncs.lua'?

Отвечая на два вышеупомянутых вопроса, имейте в виду, что функция в верхней части скрипта получает доступ к переменным, определенным позже / в другом месте скрипта. а также устанавливает переменную (флаг), которая затем используется в другом месте скрипта.

Изменяются ли правила области видимости, если Lua встроен в C или C ++ (где объекты могут создаваться в куче)?

Ответы [ 3 ]

2 голосов
/ 10 февраля 2011

war_is_needed нельзя перемещать после цикла while. Если цикл while содержится в функции, то после нее можно переместить war_is_needed. Поскольку все глобально, ответ на второй вопрос - да.

1 голос
/ 10 февраля 2011

AFAIK, вам просто нужно убедиться, что вы определили свои функции / переменные / ... перед их использованием, чтобы этот фрагмент не создавал проблем

function foo()
    print(a)
end
a="Bar!"
foo()

Но это будет:

a="Bar!"
foo()
function foo()
    print(a)
end

Таким образом, все должно быть определено до запуска функции и эффективно использовать переменные. Независимо от того, определяете ли вы их в главном скрипте или в dofile / требуете их, не имеет значения.

1 голос
/ 10 февраля 2011

LHF правильно, вы можете изменить свой код, и он все равно будет работать.Имейте в виду, однако, что, хотя все в этом конкретном примере сценария является глобальным, при работе с переменными, которые являются временно временными (скажем, в рамках цикла или отдельной функции), было бы неплохо объявить их какlocal.

Что касается третьего вопроса о встраивании в C / C ++, в скрипте Lua нет различий в правилах контекста, поскольку приложение создаст одно состояние Lua и загрузит файлы скрипта.Любые файлы, выполняющие требование, делают это в пределах состояния, в которое они были загружены во время инициализации приложения C / C ++.

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