Tilbakekallingsfunksjoner: sende Lua-funksjoner til C
Bruk ffi.cast til å opprette C-tilbakekallingsfunksjoner som kaller Lua-kode.
Tilbakekallingsfunksjoner: sende Lua-funksjoner til C er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.
Hva er C-tilbakekall?
Noen C-API-er krever at du sender en funksjonspeker som C-koden kaller tilbake. FFI-metoden ffi.cast lar deg opprette C-kompatible funksjonspekere fra Lua-funksjoner.
Deklarere en tilbakekallstype
Deklarer først funksjonspekertypen i cdef.
local ffi = require("ffi")
ffi.cdef[[
typedef void (*callback_t)(int event, void *data);
void register_handler(callback_t cb);
]]Opprette et tilbakekall
Bruk ffi.cast("callback_t", luaFunc) til å pakke inn en Lua-funksjon som et C-tilbakekall. Resultatet er en C-funksjonspeker som kan sendes til C-kode.
local function myHandler(event, data)
print("Event:", event)
end
local cb = ffi.cast("callback_t", myHandler)
lib.register_handler(cb)Levetid for tilbakekall
Behold en Lua-referanse til tilbakekallsobjektet (cb). Hvis det samles inn av GC, vil et kall til C-funksjonspekeren krasje. Lagre det i en variabel eller tabell med lang levetid.
local callbacks = {} -- prevent GC
callbacks[#callbacks+1] = ffi.cast("callback_t", myHandler)
lib.register_handler(callbacks[#callbacks])Sortere med en C-sammenligningsfunksjon
Send en Lua-sammenligningsfunksjon til Cs qsort via et FFI-tilbakekall.
ffi.cdef[[
typedef int (*cmp_t)(const void *a, const void *b);
void qsort(void *base, size_t nmemb, size_t size, cmp_t cmp);
]]
local arr = ffi.new("int[5]", {3,1,4,1,5})
local cmp = ffi.cast("cmp_t", function(a, b)
return ffi.cast("int*", a)[0] - ffi.cast("int*", b)[0]
end)
ffi.C.qsort(arr, 5, ffi.sizeof("int"), cmp)
for i = 0, 4 do io.write(arr[i] .. " ") endTilbakekall og korutiner
Lua-tilbakekall som kalles fra C, kan ikke gi kontrollen tilbake (kalle coroutine.yield). C-siden støtter ikke bytte av Lus korutiner. Utform tilbakekallene slik at de ikke gir kontrollen tilbake.
Upvalues i tilbakekall
Lua-tilbakekall kan fange opp upvalues på vanlig måte. Dette lar tilbakekall få tilgang til kontekst (for eksempel et objekt eller en tilstandstabell) uten globale variabler.
local function makeHandler(ctx)
return ffi.cast("callback_t", function(event, _)
ctx.lastEvent = event -- upvalue access
end)
endSignalbehandlere
Registrer Lua-funksjoner som Unix-signalbehandlere via FFI. Vær forsiktig: Signalbehandlere har strenge begrensninger på hvilke C-funksjoner de kan kalle.
Minnehåndtering for tilbakekall
Frigi tilbakekall med cb:free() etter at de er avregistrert på C-siden. Lekkasjer av tilbakekallsobjekter sløser med minne.
Alternativ: C-omslutningsfunksjoner
Ved komplekse integrasjoner kan en tynn C-shim være ryddigere enn FFI-tilbakekall. Shimen kaller tilbake til Lua via C-API-et og gir full kontroll over korutiner og feilhåndtering.
Ytelse
FFI-tilbakekall er raske, men ikke like raske som direkte FFI-kall, siden broen fra C til Lua medfører oppstartskostnader. For tilbakekall med svært høy frekvens (for eksempel lyd) bør du vurdere rene C-implementasjoner.
Callback-spørsmål
Hvorfor må man beholde en Lua-referanse til et FFI-callback-objekt?
Oppsummering: FFI-callbacks
Bruk ffi.cast("fn_ptr_type", luaFunc) for å opprette C-kompatible callbacks. Lagre alltid en referanse for å forhindre GC. Callbacks kan ikke gi fra seg kontroll. Bruk upvalues for å sende kontekst inn i callbacks.
Lær deg Lua med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 40
- Leksjoner
- 159
Ofte stilte spørsmål
Er leksjonen «Tilbakekallingsfunksjoner: sende Lua-funksjoner til C» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Tilbakekallingsfunksjoner: sende Lua-funksjoner til C», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Tilbakekallingsfunksjoner: sende Lua-funksjoner til C»?
Bruk ffi.cast til å opprette C-tilbakekallingsfunksjoner som kaller Lua-kode. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Lua Academy?
Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Tilbakekallingsfunksjoner: sende Lua-funksjoner til C»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?
Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Grunnleggende om FFI: ffi.cdef og ffi.load
- Kalle C-funksjoner via FFI
- Pekere, strukturer og arrayer i FFI
- Tilbakekallingsfunksjoner: sende Lua-funksjoner til C