Что это значит, в LUA, назначить неопределенный идентификатор незамущенной переменной?

StackOverflow https://stackoverflow.com/questions/3949534

  •  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 до того, как он объявлен - может ли кто-нибудь объяснить это

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top