Подтвердить что ты не робот

Почему глобальные функции Lua локальны?

Я смотрел на некоторый исходный код Lua, и я часто вижу такие вещи в начале файла:

local setmetatable, getmetatable, etc.. = setmetatable, getmetatable, etc..

Они только делают локальные функции, чтобы позволить Lua быстрее обращаться к ним при частом использовании?

4b9b3361

Ответ 1

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

Вот возможные объяснения для этого:

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

    • Один модуль не может случайно перезаписать другие функции модуля.

    • Если модуль делает это случайно, исходные функции в таблице, возвращаемые модулем, будут доступны. Только при использовании local modname = require "modname" вам гарантируется, что вы получите точно и только то, что раскрыл этот модуль.

    • Модули, содержащие другие модули, не могут мешать друг другу. Таблица, которую вы возвращаете из require, всегда хранится в модуле.

  • Преждевременная оптимизация кем-то, кто читает переменные "local, получает доступ быстрее", а затем решил сделать все local.

В целом, это хорошая практика. Ну, если это из-за # 2.

Ответ 2

В дополнение к ответу Nicol Bolas, я добавлю к третьему вопросу:

  • Он позволяет запускать ваш код из песочницы после его загрузки.

Если функции были исключены из песочницы, а код загружен из песочницы, то это не сработает. Но если сначала загружен код, песочница может вызывать загруженный код и быть в состоянии исключить setmetatable и т.д. Из песочницы.

Ответ 3

Я делаю это, потому что он позволяет мне видеть функции, используемые каждым из моих модулей

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

Ответ 4

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