Настройка "среды" для встроенного скрипта Lua
Я встраиваю интерпретатор Lua в приложение C++.
Я хочу настроить "среду" для запуска сценариев, чтобы определенные переменные были доступны для всех сценариев.
Например, я хочу предоставить объектам READ ONLY Foo и FooBar сценарии, чтобы Foo и FooBar были доступны для всех запущенных сценариев.
Кто-нибудь знает, как я могу это сделать? Фрагмент, чтобы показать, как это было бы очень полезно.
2 ответа
Я не слышал о переменных только для чтения в Lua, но вы можете предотвратить изменение, сделав среду доступной через вызов функции.
Если приложение C++ большое, вы, вероятно, захотите использовать инструмент для генерации интерфейса, который вы можете вызывать из Lua. Я использовал tolua ++ в прошлом с некоторой удачей:
предполагать demo.hpp
файл заголовка приложения C++:
#ifndef SO_DEMO_HPP
#define SO_DEMO_HPP
namespace demo
{
class Foo
{
double x;
public:
Foo(double x) : x(x) {}
double getX() const { return x; }
};
Foo* getFoo();
}
#endif
Воплощать в жизнь demo::getFoo()
в demo.cpp
,
demo.pkg
перечисляет вещи, которые должны быть вызваны из Lua:
$#include "demo.hpp"
namespace demo
{
class Foo
{
double getX() const;
};
Foo* getFoo();
}
генерировать demo_stub.cpp
а также demo_stub.hpp
файлы, содержащие наш модуль Lua:
$ tolua++5.1 -o demo_stub.cpp -H demo_stub.hpp demo.pkg
main.cpp
интерпретатор Lua, который загружает demo
модуль:
#include "demo.hpp"
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <tolua++.h>
}
#include "demo_stub.hpp"
int main()
{
lua_State *L = lua_open();
luaL_openlibs(L);
tolua_demo_open(L);
if (luaL_dofile(L, NULL) != 0)
fprintf(stderr, "%s\n", lua_tostring(L, -1));
lua_close(L);
return 0;
}
tolua_demo_open()
функция была сгенерирована tolua ++ и объявлена в demo_stub.hpp
,
Создайте интерпретатор Lua по имени demo
:
$ g++ -I/usr/include/lua5.1 demo.cpp demo_stub.cpp main.cpp -ltolua++5.1 -llua5.1 -o demo
Построить demo.lua
скрипт
print("Hello, world!")
print(tolua.type(demo.getFoo()))
print(demo.getFoo():getX())
и передаем скрипт интерпретатору:
$ ./demo < demo.lua
Hello, world!
demo::Foo
42
lua_setglobal
,
Что касается "только для чтения", вы имеете в виду, что этот Foo не будет перезаписываться (например, Foo = 10
) или что значение Foo reverse будет неизменным (например, Foo.x = 10
)?