Ответ 1
Локальные данные находятся в стеке, и поэтому они быстрее получают доступ к ним. Тем не менее, я серьезно сомневаюсь, что время вызова функции setmetatable
на самом деле является важной проблемой для некоторой программы.
Вот возможные объяснения для этого:
-
Предотвращение загрязнения глобальной окружающей среды. Современное соглашение Lua для модулей заключается в том, чтобы они не регистрировались непосредственно в глобальной таблице. Они должны построить локальную таблицу функций и вернуть их. Таким образом, единственный доступ к ним - это локальная переменная. Это приводит к нескольким вещам:
-
Один модуль не может случайно перезаписать другие функции модуля.
-
Если модуль делает это случайно, исходные функции в таблице, возвращаемые модулем, будут доступны. Только при использовании
local modname = require "modname"
вам гарантируется, что вы получите точно и только то, что раскрыл этот модуль. -
Модули, содержащие другие модули, не могут мешать друг другу. Таблица, которую вы возвращаете из
require
, всегда хранится в модуле.
-
-
Преждевременная оптимизация кем-то, кто читает переменные "
local
, получает доступ быстрее", а затем решил сделать всеlocal
.
В целом, это хорошая практика. Ну, если это из-за # 2.