2010-04-25 30 views

Trả lời

5
void register_c_function(char const * const tableName, char const * const funcName, CFunctionSignature funcPointer) 
{ 
    lua_getfield(lstate, LUA_GLOBALSINDEX, tableName); // push table onto stack 
    if (!lua_istable(lstate, -1))      // not a table, create it 
    { 
     lua_createtable(lstate, 0, 1);  // create new table 
     lua_setfield(lstate, LUA_GLOBALSINDEX, tableName); // add it to global context 

     // reset table on stack 
     lua_pop(lstate, 1);     // pop table (nil value) from stack 
     lua_getfield(lstate, LUA_GLOBALSINDEX, tableName); // push table onto stack 
    } 

    lua_pushstring(lstate, funcName);  // push key onto stack 
    lua_pushcfunction(lstate, funcPointer); // push value onto stack 
    lua_settable(lstate, -3);    // add key-value pair to table 

    lua_pop(lstate, 1);      // pop table from stack 
} 
+4

Tại sao không chỉ sử dụng luaL_register? – uroc

20

Đây là những gì luaL_register() được thiết kế để thực hiện, cho một hoặc nhiều chức năng. Việc sử dụng kinh điển là như một phần của thiết lập cho một module viết bằng C:

/* actual definitions of modA() and modB() are left as an exercise. */ 

/* list of functions in the module */ 
static const luaL_reg modfuncs[] = 
{ 
    { "a", modA}, 
    { "b", modB}, 
    { NULL, NULL } 
}; 

/* module loader function called eventually by require"mod" */ 
int luaopen_mod(lua_State *L) { 
    luaL_register(L, "mod", modfuncs); 
    return 1; 
} 

nơi này tạo ra một module có tên là "mod" rằng có hai chức năng đặt tên mod.amod.b.

Trích dẫn hướng dẫn cho luaL_register(L,libname,l):

Khi gọi với libname bằng NULL, nó chỉ đơn giản đăng ký tất cả chức năng trong danh sách l (xem luaL_Reg) vào bảng trên đỉnh của chồng .

Khi được gọi với một tổ chức phi-null libname, luaL_register tạo ra một bảng mới t, bộ nó như là giá trị của toàn cầu biến libname, đặt nó như là giá trị của package.loaded[libname], và thanh ghi trên đó tất cả các chức năng trong danh sách l. Nếu có một bảng trong package.loaded[libname] hoặc trong biến libname, hãy sử dụng lại bảng này thay vì tạo bảng mới.

Trong mọi trường hợp, hàm sẽ để lại bảng trên đầu ngăn xếp.

luaL_register() có thể được sử dụng để đặt hàm C trong bất kỳ bảng nào bằng cách chuyển NULL cho tham số thứ hai miễn là bảng nằm trên cùng của ngăn xếp.

+0

Nếu đã có bảng mod với các trường khác, nó sẽ được mở rộng hoặc thay thế bằng một bảng mới sau khi gọi luaL_register()? –

+0

nó sẽ tái sử dụng và cập nhật một bảng trước đó, theo hướng dẫn 5.1. – u0b34a0f6ae

+0

Dù được áp dụng cho một bảng toàn cầu có tên hoặc bảng ở trên cùng của ngăn xếp, nó chỉ đặt những trường được đặt tên trong danh sách hàm để đăng ký và để lại bất kỳ trường nào khác bị ảnh hưởng. Sự khác biệt là cho một tên toàn cầu, nó cũng tạo ra bảng nếu cần và thêm một tham chiếu đến 'package.loaded'. – RBerteig

Các vấn đề liên quan