Что это значит, в LUA, назначить неопределенный идентификатор незамущенной переменной?
-
08-10-2019 - |
Вопрос
Я проверял файл кода LUA, и самая верхняя часть файла содержит:
1 |. Tradeskillframereset = tradeskillframe_loadui; 2 |. 3 |. Tradeskillframe_loadui = Функция () 4 | Tradeskillframereset (); ... 112 |. Tradeskillframe_loadui = tradekillframereset; ... 114 |. конец;
Сама первая строка, которую они делают задание:
TradeSkillFrameReset = TradeSkillFrame_LoadUI;
На данный момент в файле кода они присваивают идентификатор незаменителен (TradeSkillFrame_LoadUI
) до необъявленной переменной (TradeSkillFrameReset
). Это разрешено в Луа?
- Является ли переменная декларация неявна?
- Все ли предусмотренные идентификаторы предположили прямые объявления?
Чем больше запутанная вещь в том, что первый TradeSkillFrame_LoadUI
кажется, это позвонить себе:
TradeSkillFrame_LoadUI = function()
TradeSkillFrameReset();
Как это не бесконечная петля?
Редактировать: Добавлены оставшиеся ссылки на TradeSkillFrameReset
а также TradeSkillFrame_LoadUI
.
Решение
Если TradeSkillFrame_LoadUI
это глобальная функция, первое заявление охватывает эту функцию в TradeSkillFrameReset
.
Ассигмент к TradeSkillFrame_LoadUI
затем заменяет глобальную функцию с новым, что сначала вызывает оригинальную функцию через TradeSkillFrameReset
ссылка.
Этот шаблон называется «функциональная крючка», здесь Дополнительная информация о общей методике и некоторое World of Warcraft Lua Environment Environment Feale Detailes (где этот скрипт может прийти, в соответствии с именем функции)
Какой-то пример код, чтобы сделать это понятно:
function SomeGlobalFunction()
print("I'm the original global function")
end
OrigFunction = SomeGlobalFunction
SomeGlobalFunction = function()
OrigFunction()
print("And here's the modfied one...")
end
--...
SomeGlobalFunction()
Это будет распечатать следующий вывод:
Я оригинальная глобальная функция
И вот одноместный ...
Как сбоку, имя Луа не все заглавны.
Другие советы
На первой строке, так как TradeSkillFrame_LoadUI
Неинициализированная переменная, то эта первая строка:
TradeSkillFrameReset = TradeSkillFrame_LoadUI;
Такой же, как изготовление:
TradeSkillFrameReset = nil
Функция ниже, которая не входит в бесконечную петлю, потому что TradeskillFarmereset на самом деле не «указывает на что-нибудь».
Мое предположение в том, что в конце введении в коде он правильно инициализируется. Вот так:
TradeSkillFrameReset = TradeSkillFrame_LoadUI;
TradeSkillFrame_LoadUI = function() -- 1. function declaration
TradeSkillFrameReset();
[...snip...]
end;
[... snip ...]
TradeSkillFrameReset = somethingElse -- 2. initialized to something else
TradeSkillFrame_LoadUI() -- 3. function invocation
Хитрость заключается в том, что вы можете определить функцию 1 и использовать значение переменной на 3 при изменении его на 2.
Дайте мне знать, если это недостаточно ясно.
Если поведение глобальных переменных было изменено в среде, которую вы используете, был изменен, утверждение не делает абсолютно ничего.
local TradeSkillFrameReset = TradeSkillFrame_LoadUI
Будет иметь эффект, создавая локальную переменную «слот» и выполнение кода, в которой эта точка используйте локальный переменный слот для TradeSkillFamereset, а не выполнение глобального поиска переменной для него. Однако, как это в курсе, который вы разместили, он просто назначает глобальную переменную к Nil, которая влияет на его стирание, другими словами, не влиять на эффект, если он уже был ниль.
Причины это могут быть там:
1) Окружающая среда, в котором работает код, делает что-то особенное, когда выполняется глобальное назначение переменной, а не поведение по умолчанию простого назначения. Я не думаю, что это скорее всего, хотя, как будто произошло какое-либо особое поведение, поиске Nil TradeCillframe_Loadui, вероятно, вызвало бы ошибку.
2) Самая вероятная причина просто для чтения. Это чтобы вы знали, что Tradeskillframereset буду Будьте должным образом назначены впоследствии похороненные где-то в коде, где вы не заметите его как легко.
Главное занять, так это то, что LUA легко вводить глобальные переменные в другой код LUA. Я использовал много LUA, где они используют среду для добавления глобальных вариантов. Просто потому, что VAR не определен в этом файле, наиболее уверенно, не означает, что он не существует. Его даже не нужно определять как глобальную переменную в другом файле, поскольку вы можете вводить таблицу окружающей среды программно, как если бы это была какая-либо другая таблица.
Я думаю, что это что-то похожее на функциональный подъем JavaScript, который вы можете прочитать здесь: Ссылаясь на значение JavaScript до того, как он объявлен - может ли кто-нибудь объяснить это