Как динамически создавать вызовы функции в модуле - PullRequest
1 голос
/ 19 апреля 2019

У меня есть несколько сгенерированных модулей со схемой именования, похожей на lib1_0, где 1 - старшая версия, а 0 - минорная версия.Внутри каждой находится около 300 функций, названных как type_156.

Я собираю данные и собираю их вместе, какую функцию из какого модуля мне нужно выполнить, основываясь на внешних факторах.

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

Я пробовал различные loadstring () (работает только с локальными компонентами, а не с модулями) _G [], который похож на одно и то же

lib1_0.lua

local lib1_0 = {}

function lib1_0.type_1(arg1, arg2, arg3)
    print(arg1, arg2, arg3)
end

function lib1_0.type_2(arg1, arg2, arg3)
    print(arg1, arg2, arg3)
end

return lib1_0

mainfile.lua

call1_0 = require(lib1_0)
call1_2 = require(lib1_2)
call2_0 = require(lib2_0)

-- do stuff and find that I want to execute lib1_0 function 2 based on external factors

major = 1
minor = 0
func2run = 2

call = "call" .. major .. "_" .. minor .. ".type_" .. func2run
_G[call]("test1", "test2", "test3")
--does not work, just an example of what I want to do

Есть какие-нибудь решения?я что-то упускаю очевидное?Я очень плохо знаком с Луа, поэтому я мог просто пропустить очевидное

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019
local call_1 = require(lib1_0)
package.loaded.call_1 = call_1
package.loaded["lib1_0"] = nil

local call_2 = require(lib1_0)
package.loaded.call_2 = call_2
package.loaded["lib1_0"] = nil
0 голосов
/ 20 апреля 2019

обратите внимание на кавычки в вызове require (). Также см. Программирование в Lua (PiL) 4-е издание, p148-149 для получения дополнительной информации о load ().

call1_0 = require("lib1_0")

-- example of desired outcome
call1_0.type_2("x","y","z")             --> x     y   z

-- build up call from pieces
local major, minor, fnum = 1, 0, 2
local args = "'x', 'y', 'z'"
local codestr = string.format("call%d_%d.type_%d(%s)", major, minor, fnum, args)
print(codestr)                          --> call1_0.type_2('x', 'y', 'z')
local code = load(codestr)
code()                                  --> x     y   z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...