Зачем делать глобальные функции Lua локальными? - PullRequest
12 голосов
/ 08 февраля 2012

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

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

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

Ответы [ 4 ]

13 голосов
/ 08 февраля 2012

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

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

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

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

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

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

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

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

5 голосов
/ 09 февраля 2012

В дополнение к ответу Никол Болас, я бы добавил к 3-му пункту:

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

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

1 голос
/ 08 февраля 2012

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

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

0 голосов
/ 28 августа 2012

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

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