Lua предварительный вопрос относительно модулей / require - PullRequest
0 голосов
/ 15 февраля 2011

Я использую квази модульный подход "Из таблицы - Использование локальных локально", как описано на на этой странице .

local M = {}

-- private
local x = 1
local function baz() print 'test' end

local function foo() print("foo", x) end
M.foo = foo

local function bar()
  foo()
  baz()
  print "bar"
end
M.bar = bar

return M

Однако я не добавляю функции и т. Д. В таблицу модулей после определения функции. Вместо этого я делаю это внизу файла.

local x = 1
local function baz() print 'test' end

local function foo() print("foo", x) end

local function bar()
  foo()
  baz()
  print "bar"
end

local M = {
  bar = bar,
  foo = foo,
}
return M

Как ясно видно, M является локальной переменной. Я задавался вопросом, если изменение на

local x = 1
local function baz() print 'test' end

local function foo() print("foo", x) end

local function bar()
  foo()
  baz()
  print "bar"
end

return {
  bar = bar,
  foo = foo,
}

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

local foo = require 'foomodule'

это не будет иметь значения (с точки зрения производительности), потому что я привязываю локальную переменную foo к возвращаемой таблице.

1 Ответ

5 голосов
/ 15 февраля 2011

Краткая версия: все эти фрагменты кода эквивалентны.

Очевидно, что создание глобальной таблицы модулей зависит от пользователя, пишущего модуль.require"foomodule" правильно загружает модуль, но он не создает таблицу foomodule в таблице глобальных параметров _G.Он создает таблицу модулей в package.loaded.

Так что в основном это ваш выбор:

  1. Создайте глобальную таблицу модулей в вашем модуле, и просто require "foomodule" создаст глобальнуюfoomodule table
  2. Оставьте решение на усмотрение пользователя: сделайте как в третьем фрагменте кода и просто верните неназванную таблицу.

По моему мнению, вариант 2 предпочтительнее, чемон случайно не испортит таблицу пользователей, имя которой совпадает с именем вашего модуля, или, по крайней мере, он узнает, что стирает свою таблицу, если увидит foo = require'...'.Однако, похоже, что большинство модулей используют первый подход, и просто надеемся, что эта проблема не возникнет.

Что касается локальных, это просто, локальный является локальным;).Поэтому, если вы объявляете локальную версию, она доступна только в той области, в которой она объявлена ​​(см. раздел 2.6: Видимость в Справочном руководстве).

...