Lua & неявное глобальное состояние - PullRequest
1 голос
/ 02 марта 2011

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

-- Inside lua
local state = host.get_state()
-- Do something with "state"

Теперь проблема в том, что состояние, очевидно, можетизменить, и тогда переменная «состояние» будет устаревшей и, скорее всего, недействительной.До сих пор я жил с этим, потому что глобальное состояние не требуется слишком часто.Это более проблематично в следующем сценарии:

local user = host.get_user('id')
host.set_user_flags(user, 'abc')
-- internally "user" is now updated, but to get the accurate information in Lua, I
-- will have to explicitly redo "user = host.get_user('id')" for every operation
-- that accesses this table

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

Нетесть ли какой-нибудь способ просто разбрасывать указатели, как я могу сделать это в C?

Ответы [ 2 ]

0 голосов
/ 02 марта 2011

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

static int dostuff(lua_State *L)
{
    lua_pushstring(L, "b");
    lua_pushnumber(L, 23);
    lua_settable(L, 1);

    return 0;
}
/* lua_register(L, "dostuff", &dostuff); */

А внутри Луа:

t = { a = 'a', b = 2 }

print(t.a, t.b)
dostuff(t)
print(t.a, t.b)

Результатом будет:

a   2
a   23
0 голосов
/ 02 марта 2011

Любая ссылка, которую вы используете внутри функции, не изменит var вне ее.Вы должны использовать что-то вроде этого:

local count
function MyFunc()
      count = 1
end

«Локальный» не обязательно.

В качестве альтернативы я могу предложить вам использовать небезопасный метод:

count = 0
function MyFunc(v) --we will throw varname as a string inside
     _G[v] = 1 -- _G is a global environment
end
MyFunc('count')
print(count)
...