Зачем нажимать дубликат ключа при добавлении в таблицу в Lua? - PullRequest
2 голосов
/ 23 июля 2010

Я учусь связывать объекты C ++ с Lua с помощью проверки типов из книги Программирование Gems 6 (Глава 4.2).Для проверки типа пары userdata / string хранятся в таблице окружения с указанным кодом, как это сделать:

void Binder::pushusertype(void* udata, const char* tname) {
 lua_pushlightuserdata(L, udata); // push address 
 lua_pushvalue(L, -1);    // duplicate address
 lua_pushstring(L, tname);  // push type name
 lua_rawset(L, LUA_ENVIRONMENTINDEX); // envtable[address] = tname
}

Где класс Binder имеет Lua State в качестве атрибута с именем "L"

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

Ответы [ 2 ]

2 голосов
/ 24 июля 2010

Эта функция делает две вещи:

она помещает объект lightuserdata в стек, и она будет в положении lua stack -1, когда функция вернется.Также обновляется текущая функциональная среда с именем tname, хранящимся в ключе таблицы address (равно udata).Если текущая функциональная среда является нормальной глобальной средой, эквивалентный код Lua будет:

local x = <udata as lightuserdata>
_G[x] = <tname>

Один дубликат x используется для выполнения операции _G[x] = ..., другой остается в стекекогда функция возвращается (в соответствии с именем функции, которая начинается с push).

2 голосов
/ 23 июля 2010

Вы этого не сделаете.

lua_rawset выведет имя и дубликат из стека, но оставит исходные данные пользователя в стеке.Я не уверен, если это опечатка (выглядит маловероятно), я думаю, это может понадобиться позже.Не знаю, есть ли еще что-то в книге, где упоминается об этом, но это то, что будет делать код.

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