Как проверить, передается ли параметр Lua пользовательского типа? - PullRequest
1 голос
/ 22 апреля 2011

Я реализую сценарии для моего приложения на основе Ogre3d, используя Lua, и я столкнулся с проблемой проверки того, имеет ли параметр, переданный в функцию, определенный тип - Ogre :: SceneNode *.Кто-нибудь знает, как я могу это сделать?

Есть некоторые базовые функции Lua, делающие это для встроенных типов, таких как int или string, например

if(lua_isnumber(L,1)) {...}

, но я незнать, как это сделать с пользовательскими типами.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2011

Если вы договорились, что каждый из ваших userdata определенного типа будет использовать метатаблицу, вы можете использовать luaL_checkudata для подтверждения их типа.Обычно это то, как библиотека тегирует и идентифицирует данные, которые она создает.

Вот некоторые функции, которые создают и проверяют пользовательские данные, используя эту технику:

static decContext *ldn_check_context (lua_State *L, int index)
{
    decContext *dc = (decContext *)luaL_checkudata (L, index, dn_context_meta);
    if (dc == NULL) luaL_argerror (L, index, "decNumber bad context");
    return dc; /* leaves context on Lua stack */
}

static decContext *ldn_make_context (lua_State *L)
{
    decContext *dc = (decContext *)lua_newuserdata(L, sizeof(decContext));
    luaL_getmetatable (L, dn_context_meta);
    lua_setmetatable (L, -2); /* set metatable */
    return dc;  /* leaves context on Lua stack */
}

Метатабельный объект был создан с помощью

const char *dn_context_meta = "decNumber_CoNTeXT_MeTA";
luaL_newmetatable (L, dn_context_meta);
1 голос
/ 22 апреля 2011

Я думаю lua_isuserdata(L, yourParam)?

Было бы логично.

...