Обработка userdate как таблица в Lua

У меня есть некоторые классы в C++, который я хотел бы выставить Lua. Я могу звонить Widget:New() получить возврат userdata с набором таблицы метаданных к таблице WidgetMeta. WidgetMeta имеет все функции C++ в нем, и это __index установлен на себя, таким образом, я могу сделать это:

w = Widget:New()
w:Foo() -- Foo is defined in C code

Это все довольно просто.

Теперь вот первая часть, не может выяснить. Я хочу смочь поместить определенные переменные Lua и функции на моем userdata, как будто это была таблица. Это не может быть сделано непосредственно, очевидно. Я не могу отбросить его на userdata, потому что я хочу, чтобы это было уникально на userdata.

w1 = Widget:New()
w2 = Widget:New()

function w1:Bar() print "Hello!" end -- Both functions unique
function w1:Baz() print "World!" end -- to their own userdata

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

8
задан Alex 26 July 2010 в 05:48
поделиться

2 ответа

Добавьте функциональную среду в пользовательские данные и перенаправьте доступ через нее.

Вот мой старый код, описывающий процесс.

static int l_irc_index( lua_State* L )
{
    /* object, key */
    /* first check the environment */ 
    lua_getfenv( L, -2 );
    lua_pushvalue( L, -2 );
    lua_rawget( L, -2 );
    if( lua_isnoneornil( L, -1 ) == 0 )
    {
        return 1;
    }

    lua_pop( L, 2 );

    /* second check the metatable */    
    lua_getmetatable( L, -2 );
    lua_pushvalue( L, -2 );
    lua_rawget( L, -2 );

    /* nil or otherwise, we return here */
    return 1;
}

static int l_irc_newindex( lua_State* L )
{
    /* object, key, value */

    lua_getfenv( L, -3 );
    lua_pushvalue( L, -3 );
    lua_pushvalue( L, -3 );
    lua_rawset( L, -3 );

    return 0;
}
9
ответ дан 5 December 2019 в 18:55
поделиться

Вам действительно стоит взглянуть на tolua ++, который имеет очень похожую концепцию. Все объекты userdata, созданные с помощью lua, имеют скрытую таблицу для хранения их свойств.

Этот раздел руководства описывает это: http://www.codenix.com/~tolua/tolua++.html#additional

0
ответ дан 5 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: