Lua: функции «Скрыть» - PullRequest
       0

Lua: функции «Скрыть»

4 голосов
/ 17 февраля 2020

Я хочу вызвать c функции из lua для изменения переменных, определенных в C, но я не хочу, чтобы lua "пользователь" понимал, что они являются функциями.

Для Например, рассмотрим целое число и массив, созданный в c:

int c_level = 0;
int c_map[4] = {0,0,0,0}; 

Теперь программа создает состояние Lua и выполняет следующее:

set_level(2) --c_level = 2
set_tile(1,23) --c_map[0] = 23

Я хочу, чтобы они выглядели например, в сценарии lua:

L_level = 2
L_map[1] = 23

Итак, L_level и L_map будут функциями, определенными в C.

L_level аргумент будет "2".

L_map аргументы "1" и "23".

Возможно ли это ?.

Я могу получить переменные lua с помощью getglobal, но я хотел знать, могу ли я создать некоторые lua функции, которые выглядят так, как я показал.

Спасибо.

1 Ответ

1 голос
/ 17 февраля 2020

Когда вы устанавливаете

L_level = 2

, вы действительно индексируете глобальную таблицу _G с помощью ключа L_level и устанавливаете ее на 2. Что вы можете сделать, это установить meta -table для _G и установить функцию __newindex в функцию, которая проверяет, является ли ключ L_level или L_map, и обрабатывает эти случаи по-разному. .

Эта функция может быть напрямую C -функцией или Lua -функцией, которая проверяет ключ и вызывает c -функцию, если имя соответствует одному из ваших отслеживаемых имен, например как

setmetatable(_G, {
    __newindex = function (_, k, v)
        if (k == "L_level") then do_setlevel(v)
        elseif (k == "L_map") then do_setmap(v)
        else rawset(_G, k, v)
        endif
    end
})

do_setlevel и do_setmap в этом случае являются глобальными c функциями. Конечно, вы можете сделать все это и в C.

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