Как вызвать функции lua из внешней библиотеки из нескольких источников? - PullRequest
1 голос
/ 21 декабря 2011

Я новичок в lua и пытаюсь сделать следующее:

Допустим, есть внешний модуль mycalculator.lua и он имеет функцию myadd (a, b).

Теперь я хочу получить еще два файла A.lua и B.lua, использующих mycalculator.Они оба используют myadd (a, b) из mycalculator, но имеют свои собственные функции mycalcA и mycalcB, которые я хочу вызывать в третьей функции в C.lua.Мне нужно понять, как я должен загрузить их и в какой последовательности.Верны ли зависимости требований в C.lua?Это можно сделать или это круговая?Также я могу перегрузить mycalc (a, b), чтобы это было одинаковое имя функции в A и B?

-- A.lua
require 'mycalculator'

a=1;
b=2;
n=20;

function mycalcA(a,b)
     return myadd(a,b)+20;
end
function  A()
  local A = {}
     A.mycalcA = mycalcA
  return A
end

-- B.lua

require 'mycalculator'

a=1;
b=2;
X=50;

function mycalcB(a,b)
     return myadd(a,b)+50;
end
function  B()
  local B = {}
     B.mycalcB = mycalcB
  return B
end

-- C.lua

require 'A'
require 'B'

print(mycalcB(1,2))
print(mycalcA(1,2))

Ответы [ 2 ]

4 голосов
/ 21 декабря 2011
  • Корректны ли зависимости требований в C.lua? Это можно сделать или это круговая?
    • То, что у тебя есть, прекрасно для меня выглядит.
  • Могу ли я перегрузить mycalc (a, b), чтобы у A и B было одинаковое имя функции?
    • Я не думаю, что это имело бы смысл без другого изменения, которое заключалось бы в определении определений в А и В и возвращении таблицы из каждого. Это будет выглядеть так:

B.lua (и A.lua аналогично):

require 'mycalculator'

local a=1;
local b=2;
local X=50;

local function mycalcB(a,b)
     return myadd(a,b)+50;
end

B = {
    mycalc = mycalcB
}
return B

C.lua:

require 'A'
require 'B'

print(B.mycalc(1,2))
print(A.mycalc(1,2))
2 голосов
/ 21 декабря 2011

Корректны ли зависимости требований в C.lua? Это можно сделать или это круговая?

Просто чтобы немного расширить ответ Джона. Когда вы require модуль в lua, он сначала проверяет, загружен ли уже этот модуль. Круговая зависимость здесь не является проблемой, потому что, если модуль «A» загружает mycalculator сначала, а модуль «B» требует этого после, виртуальная машина lua не будет перезагружать mycalculator снова.

К вашему сведению, lua отслеживает, какие модули загружены через таблицу package.loaded. Когда новый модуль загружен, эта таблица обновляется новой записью с модулем в качестве имени записи. Модули, которые еще не загружены, не будут иметь записи в package.loaded, поэтому его значение будет равно нулю.

Еще одна тонкая вещь в вашем коде, которую Джон исправляет:

-- A.lua
require 'mycalculator'

a=1;
b=2;
n=20;
-- ...

-- B.lua
require 'mycalculator'

a=1;
b=2;
x=50;
-- ...

Эти переменные являются глобальными по умолчанию. Когда вам требуются модули «A» и «B», эти переменные будут выгружены в глобальное пространство имен вашего модуля «C», которое может оказаться не тем, что вы хотите. Чтобы лучше разделить это и сохранить его в области видимости файла, просто поставьте перед этими переменными префикс «local», как показано в примере Джона.

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