Есть ли в Lua разница между локальными функциями, объявленными с ключевым словом local и без него? - PullRequest
0 голосов
/ 27 июня 2018

Предисловие: Насколько я вижу, документы на сайте на самом деле не говорят об этом, и я не нашел никого другого, даже задающего вопрос, так что я уверен эти две формы идентичны, но я хочу знать, знает ли кто-нибудь наверняка .

Учитывая этот код Lua:

function f()
    function a() ... end
    local function b() ... end
    ...
end

Есть ли функциональная разница между a() и b()? Я говорю с точки зрения производительности, доступа, предостережений, всего на свете. Как, в конце концов, они оба имеют одинаковое базовое представление во время выполнения?

Я подозреваю, что нет никакой разницы, но я не уверен , и это меня беспокоит. Я знаю, что a() имеет область действия для включающей функции f(), но я не уверен, действительно ли это делает ее локальной переменной с точки зрения функционирования вещей под капотом. С b() я могу быть уверен.

Мы знаем из официальных документов, что мое определение b() выше является синтаксическим сахаром для этого:

    local b
    b = function() ... end

Я испытываю желание поверить, что даже без ключевого слова local в моем определении, окончательное обезвоженное определение a() также будет следовать именно этому формату, включая local a часть.

Я просто чувствую, что не могу предположить это.

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Это не полный ответ на ваш вопрос, но наиболее доступный взгляд под капотом Lua - здесь , написанный создателем Lua. Существует некоторое обсуждение локальных переменных, но я не думаю, что это точно отвечает на ваш вопрос. Раздел «внешние местные жители» и явно объявленные местные жители информативны.

EDIT: И здесь тоже. Мне придется прочитать это снова, чтобы увидеть, отвечает ли он на ваш вопрос. Если ты побьешь меня, поделись тем, что ты узнал!

0 голосов
/ 27 июня 2018

function a() end в вашем кодовом блоке присваивает глобальное a при запуске функции *, тогда как b остается локальным для функции.

Возможно, этот фрагмент кода лучше проиллюстрирует:

function f()
    function a() end
    local function b() end
end
print(a, b) -- nil, nil
f()
print(a, b) -- function: 0xdeadbeef, nil

Чтобы не загрязнять глобальную среду, вы все равно должны использовать local внутри функции.


* Если вы не объявили a локальным в какой-либо другой области действия выше f, в этом случае a сохранит свою область видимости.

0 голосов
/ 27 июня 2018

С точки зрения производительности локальные функции быстрее, чем глобальные. В больших кодовых базах общая уловка оптимизации lua состоит в том, чтобы «кэшировать» глобально определенную функцию в локальной ссылке и использовать последнюю. В коде:

--file_A.lua
function performAnExpensiveComputation()
...
end

А в файле, где вы действительно хотите использовать эту функцию:

--file_B.lua
require "file_A.lua"

local performAnExpensiveComputation = performAnExpensiveComputation 

local result = performAnExpensiveComputation() --You are now using the locally referenced function

Это всего лишь разновидность техники, используемой для оптимизации lua переменных.

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