2013-09-25 3 views
3

Я хочу, как мы можем предоставить свойства библиотеки lua.Как открыть свойства библиотеки Lua из C++

luaL_openlib(L, kName, kVTable, 1); // leave "library" on top of stack 

С этим, я могу выставить только функции, как kVTable относится к luaL_Reg

typedef struct luaL_Reg { 
    const char *name; 
    lua_CFunction func; 
} luaL_Reg; 

Eg: С учетом указанных выше кода. Я могу сделать следующее.

local myLib = require "plugin.myLib" 
myLib.newFunc(); 

Однако, я хочу представить таблицу Lua в библиотеку как переменная CONSTANTS.

myLib.CONSTANTS.SOME_CONST_1 
myLib.CONSTANTS.SOME_CONST_2 

и т. Д. Пожалуйста, дайте мне знать, как я могу выставить lua Table из моей библиотеки в качестве свойства.

+0

Какую версию Lua вы используете? AFAIK luaL_openlib был удален в Lua 5.1. – mpeterv

+0

@peterm Я использую CORONA Enterprise. Из файлов заголовков я мог видеть, что они используют Lua 5.1. Из руководства Lua 5.1 говорится, что функция luaL_openlib была заменена на luaL_register. luaL_register также принимает массив luaL_Reg, что означает, что я могу передавать таблицу с ключом (string) и значениями как cfunctions. Я хочу даже установить таблицу в значения. – kapser

+0

@kapser Если вы раскрываете очень ограниченный набор API от 'C', вы можете использовать то, что предложили @peterm. Но для чего-то более обширного (особенно если это 'C++', в отличие от 'C'), вы можете рассмотреть использование lua API-оболочки, например [luabind] (http://www.rasterbar.com/products/luabind/docs .html). –

ответ

3

Как luaL_openlib оставляет таблицу библиотеки сверху на стеке, вы можете использовать обычный C API для добавления новых полей и подтаблицы к нему:

luaL_openlib(L, kName, kVTable, 1); // leaves "library" on top of stack 
lua_pushstring(L, "CONSTANTS"); 
lua_newtable(L); // this will be CONSTANTS subtable 

lua_pushstring(L, "SOME_CONST_1"); 
lua_pushnumber(L, 42); // SOME_CONST_1 value 
lua_settable(L, -3); // sets SOME_CONST_1 

lua_pushstring(L, "SOME_CONST_2"); 
lua_pushnumber(L, 12345); // SOME_CONST_2 value 
lua_settable(L, -3); // sets SOME_CONST_2 

lua_settable(L, -3); // sets CONSTANTS table as field of the library table 
return 1; 
+0

Спасибо, Питер. Это помогло мне больше узнать о lua и о том, как нажимать элементы в стеке lua. – kapser

0

Если вы используете C++, вы можете использовать библиотеку связывания, такую ​​как только заголовок luabridge, чтобы связать некоторые данные с названными таблицами в Lua. Преобразование вашего примера в LuaBridge, вызовите эту функцию после инициализации Lua состояния:

void register_constants (lua_State* L) { 

    luabridge::getGlobalNamespace(L) 
     .beginNamespace("myLib") 
      .beginNamespace("CONSTANTS") 
       .addVariable("SOME_CONST_1",&some_const_1,false/*read-only*/) 
       .addVariable("SOME_CONST_2",&some_const_2,false/*read-only*/) 
      .endNamespace() 
     .endNamespace() 
    ; 
} 

...

lua_State* L=lua_open(); 
register_constants(L); 
... 

вы можете получить доступ к константам в качестве последнего фрагмента кода

+1

Вы должны любить все ненужные указатели. –

+0

Это ваш повод к downvote? –

+0

Я не сделал это, это должно быть кто-то еще. –

0

РИСКОВАННОГО, lector, потому что API Lua C, ну, C API.

Всеобложение с loadlib и друзьями было связано с тем, что функции намного сложнее передать с использованием функций C (C не являются значениями первого класса). Поэтому лучше всего установить все эти константы, используя обычный API стека.

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

Смежные вопросы