簡體   English   中英

如何從c ++創建和調用lua函數(即多個文件)

[英]how to create and call lua function, that is in multiple files, from c++

我需要創建類似onSomeEvent函數的東西,該函數將出現在每個Lua插件文件中。 我有這個:

void onSomeEvent(int someParameter) {
    lua_getglobal(L, "onSomeEvent");
    lua_pushnumber(L, someParameter);
    lua_pcall(L, 1, 0, 0);
    lua_pop(L, 1);
}

但它僅適用於最后一個Lua文件。 但是,它僅調用最近加載的Lua文件中的最后一個onSomeEvent函數。 我想從每個加載的Lua文件中調用onSomeEvent函數...

您對此有什么想法嗎?

對不起,我的英語不好。

onSomeEvent顯然是全局的。 定義它的每個腳本都將覆蓋先前的定義。 您可以為每個腳本提供自己的環境或Lua狀態,但是讓腳本告訴其事件處理程序在哪里要干凈得多,而不是按照約定將其置於特定的位置(例如,名為onSomeEvent的全局變量)要干凈得多。

您的C程序只需要公開一個函數,腳本可以使用該函數來注冊事件處理程序。 這是一個示例(請注意,沒有錯誤處理或邊界檢查,這只是出於說明目的):

#include "lua.h"
#include "lauxlib.h"

// list of registered handlers
static int handlers[20];

// number that are current registered
int numHandlers = 0;

// allow scripts to register a new handler
static int addEventHandler (lua_State* L) {
    if (!lua_isfunction(L,1)) {
        luaL_argerror(L, 1, "expected function");
    }
    lua_pushvalue(L, -1);
    handlers[numHandlers++] = luaL_ref(L, LUA_REGISTRYINDEX);
    return 0;
}

// call the registered handlers
static void onEvent (lua_State* L) {
    int i;
    for (i = 0; i < numHandlers; ++i) {
        lua_rawgeti(L, LUA_REGISTRYINDEX, handlers[i]);
        lua_pcall(L, 0, 0, 0);
    }
}

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

    // expose function that lets scripts register a callback handler
    lua_register(L, "addEventHandler", addEventHandler);

    // run test script
    luaL_dofile(L, "handlertest.lua");

    // call any callback(s) registered by the test script
    onEvent(L);

    lua_close(L);
    return 0;
}

handlertest.lua

addEventHandler(function() print("anonymous function called") end)

local function localFunc() print("local function called") end
addEventHandler(localFunc)

function globalFunction() print("global function called") end
addEventHandler(globalFunction)

產量

anonymous function called
local function called
global function called

如果所有腳本都定義了一個名為onSomeEvent的全局函數,那么在加載腳本時,需要為它們提供不同的環境。 當需要處理事件時,請遍歷腳本環境列表並調用每個腳本的事件處理程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM