Jak zarejestrować funkcję C w języku Lua, ale nie w kontekście globalnym, ale jako pole tabeli?Funkcja rejestru C w tabeli Lua
Odpowiedz
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
}
To co luaL_register()
przeznaczony jest do zrobienia, dla jednego lub większej liczby funkcji. Wykorzystanie kanoniczna jest jako część konfiguracji dla modułu napisanego w 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;
}
gdzie ten tworzy moduł o nazwie „mod”, który ma dwie funkcje o nazwach mod.a
i mod.b
.
Cytując instrukcję dla luaL_register(L,libname,l)
:
Wywołany z
libname
równejNULL
, to po prostu rejestruje wszystkie funkcje na liściel
(patrzluaL_Reg
) w tabeli na górze stosie .Wywołany z niepuste
libname
,luaL_register
tworzy nową tabelęt
, ustawia go jako wartość globalnego zmiennejlibname
, ustawia go jako wartość zpackage.loaded[libname]
i rejestry na nim wszystkie funkcje na liście listal
. Jeśli w tabeli znajduje się tabelapackage.loaded[libname]
lub zmiennalibname
, ponownie korzysta z tej tabeli zamiast , tworząc nową.W każdym przypadku funkcja opuszcza tabelę na szczycie stosu.
luaL_register()
mogą być wykorzystane do umieszczenia funkcji C w każdej tabeli przepuszczając NULL
do drugiego parametru, o ile tablica jest na górze stosu.
Jeśli istnieje już tabela mod z innymi polami, czy zostanie ona rozszerzona lub zastąpiona nową po wywołaniu luaL_register()? –
to ponownie wykorzysta i zaktualizuje poprzednią tabelę, zgodnie z instrukcją 5.1. – u0b34a0f6ae
Niezależnie od tego, czy zostanie zastosowana do nazwanej tabeli globalnej, czy do tabeli u góry stosu, ustawia tylko te pola, które zostały wymienione na liście funkcji do zarejestrowania, i pozostawia nietknięte inne pola. Różnica polega na tym, że podając nazwę globalną, w razie potrzeby tworzy ona tabelę i dodaje odniesienie do "package.loaded". – RBerteig
- 1. tabeli wewnątrz tabeli w Lua
- 2. Przesuwanie tabeli Lua
- 3. Traktowanie daty użytkownika jak tabeli w Lua
- 4. Sprawdź, czy funkcja jest w języku C lub Lua zaimplementowana
- 5. Umieszczanie Lua w C+Osadzanie Lua w C++
- 6. Łańcuch hierarchii Lua do tabeli
- 7. Odejmij tabelę od tabeli w Lua
- 8. jak usunąć wszystkie elementy w tabeli Lua?
- 9. Asocjatywne sortowanie tabeli według wartości w Lua
- 10. Jak mogę dołączyć do tabeli w Lua
- 11. Uzyskaj polecenie lua, gdy funkcja c nazywa się
- 12. Jak utworzyć tabelę Lua w C++ i przekazać ją do funkcji Lua?
- 13. Zastępowanie funkcji długości tabeli Lua nie działa
- 14. Kompilacja wbudowanego lua w C
- 15. Pobierz tabelę wielkości Lua w C
- 16. Wieloplatformowa implementacja C# Lua
- 17. Lua Wrapper dla C#?
- 18. Wstawianie par kluczy do tabeli Lua
- 19. Piaskownica w Lua 5.2
- 20. Dlaczego funkcja w tabeli nazywa nawet jeśli nie jest wybrany
- 21. w Lua, jak mogę użyć tabeli jako varargs (...)?
- 22. Używanie C++ do edytowania rejestru
- 23. Wywołanie funkcji Lua 5.2 z C++
- 24. Argumenty Lua przekazane do funkcji w tabeli są zerowe
- 25. Tymczasowa funkcja postgresql tabeli
- 26. Kod wcięcia Lua w Lua
- 27. Rejestru rejestru PHP
- 28. Znajdowanie każdej kombinacji elementów w tabeli (Lua/PseudoCode)
- 29. Lua, C++ i znikające metatables
- 30. Lua i C++: rozdział obowiązków
Dlaczego po prostu nie używać luaL_register? – uroc