How to connect Lua and C++

Материал из Поле цифровой дидактики
Описание C++ может вызывать функции Lua, а Lua может вызывать функции C++. Это позволяет вынести часть кода в скрипты и писать собственные функции, расширяющие функциональность программы.
Область знаний Информатика
Область использования (ISTE)
Возрастная категория 14


Поясняющее видео https://www.youtube.com/watch?v=kDHGfHxwymI
Близкие рецепту понятия
Среды и средства для приготовления рецепта: Lua, C++

Example 1

#include <lua.hpp>

int main() {
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    luaL_dofile(L, "script.lua");

    lua_getglobal(L, "myFunction");
    lua_pushnumber(L, 10);
    lua_pushnumber(L, 20);
    lua_call(L, 2, 1);

    int result = lua_tonumber(L, -1);
    lua_pop(L, 1);

    lua_close(L);
    return 0;
}

Example 2

#include <lua.hpp>

class MyClass {
public:
    int x;
    int y;
};

int main() {
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);

    MyClass* obj = new MyClass();
    obj->x = 10;
    obj->y = 20;

    lua_pushlightuserdata(L, obj);
    lua_setglobal(L, "myObject");

    luaL_dofile(L, "script.lua");

    lua_close(L);
    return 0;
}

Example 3 Registering C++ functions for Lua code to cal

#include <lua.hpp>

int myFunction(lua_State* L) {
    int x = lua_tonumber(L, 1);
    int y = lua_tonumber(L, 2);
    int result = x + y;
    lua_pushnumber(L, result);
    return 1;
}

int main() {
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);

    lua_pushcfunction(L, myFunction);
    lua_setglobal(L, "myFunction");

    luaL_dofile(L, "script.lua");

    lua_close(L);
    return 0;
}

Example 4 Using Lua to configure C++ objects:

#include <lua.hpp>

class MyClass {
public:
    int x;
    int y;
};

int main() {
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);

    MyClass* obj = new MyClass();
    obj->x = 10;
    obj->y = 20;

    lua_newtable(L);
    lua_pushnumber(L, obj->x);
    lua_setfield(L, -2, "x");
    lua_pushnumber(L, obj->y);
    lua_setfield(L, -2, "y");
    lua_setglobal(L, "myObject");

    luaL_dofile(L, "script.lua");

    obj->x = lua_tonumber(L, -2);
    obj->y = lua_tonumber(L, -1);

    lua_close(L);
    return 0;
}