Я не знаю, что именно вы подразумеваете под «областью действия» этих сценариев. Что именно делают эти сценарии, зависит от того, как они выполняются. Вы могли бы дать им другую среду, таким образом изменив то, что они считают «глобальными».
Итак, я объясню, что делает каждый из этих сценариев, исходя из предположения, что вы загружаете их с dofile
, dostring
или чем-то подобным. То есть вы применяете их в глобальной среде.
A)
Это создает единственную глобальную переменную foo
, которая является функцией.
В)
Это создает одну глобальную переменную calc
, которая является таблицей . Эта таблица содержит одну запись с ключом foo
, значение которого является функцией.
С)
Это создает две глобальные переменные. foo
- это функция. calculator
также является функцией. Каждый вызов calculator
приведет к перезаписи глобальной переменной calc
. Новое значение calc
будет таблицей с единственной записью с ключом foo
, значение которого является копией того, что хранится в глобальной переменной foo
.
Трудно сказать, каковы "преимущества" метода C , поскольку в этом нет смысла. Он создает две функции вместо одной, и эта вторая функция продолжает создавать новые таблицы.
B - это просто версия пространства имен для A . Общее ожидание с модулями Lua состоит в том, что включение их обычно создает некоторую таблицу, которая будет содержать все функции в этом модуле, чтобы избежать конфликтов имен с существующим глобальным состоянием. В этом отношении B может быть лучше. Но это в основном зависит от того, для чего этот скрипт будет использоваться.
Лично для простых сценариев оболочки и служебных сценариев я не беспокоюсь о правильной области видимости модуля. Когда я делаю правильный модуль, я обычно использую функцию module
Lua.