Der PHP-Editor Xiaoxin zeigt Ihnen, wie Sie mit gopher-lua eine Funktion mit vordefinierten Tabellenparametern in der Lua-Funktion definieren und auf die Tabelle innerhalb der Funktion zugreifen. gopher-lua ist ein in der Go-Sprache implementierter Lua-Interpreter, der Lua-Skripte in Go-Programme einbetten und ausführen kann. Durch vernünftiges Code-Design und -Nutzung können wir dieses Ziel leicht erreichen. Als nächstes erklären wir im Detail, wie das geht.
Ich weiß, wie man eine Go-Funktion definiert und global macht (Doppelbeispiel in der Dokumentation). Was aber, wenn der Parameter dieser Funktion eine vordefinierte Tabelle sein soll?
function calling_this_function_would_be_required(predefined_table) print(predefined_table["something"]) end
IMAP-Server Dovecot bietet so etwas wie das oben genannte: https://doc.dovecot.org/configuration_manual/authentication/lua_based_authentication/#examples
Ich möchte auch vordefinierte Funktionen mit Tabellen (oder sogar Benutzerdaten) bereitstellen. Aber ich weiß nicht wirklich, wie ich das erreichen soll.
Eine Tabelle global zu machen ist einfach (L.SetGlobal(...)), aber wie fügt man sie der erwarteten Funktion hinzu?
Fügen Sie einige Funktionen in Go hinzu
func CallMe(L *lua.LState) { // How do I add a table as argument?? } func Foo() { L := NewState() defer L.Close() t := L.NewTable() t.RawSetString("example", lua.LString("some_value")) // I do not want a global table. I would like an expected Lua function that has _this_ table as argument L.SetGlobal("predefined_table", t) // Not even sure with his... L.SetGlobal("calling_this_function_is_required", L.NewFunction©llMe)) }
Es wäre toll, wenn mir jemand Inspiration geben könnte :-) Vielen Dank im Voraus
Anhand der Antwort von @koyaanisqatsi habe ich herausgefunden, wie ich das in Go zum Laufen bringen kann.
Go-Codebeispiel:
<code>package main import ( "fmt" "github.com/yuin/gopher-lua" ) type Person struct { Name string GivenName string Street string PostalCode string City string } func main() { p := &Person{ Name: "Mustermann", GivenName: "Max", Street: "Sackgasse 19", PostalCode: "36304", City: "Alsfeld", } L := lua.NewState() defer L.Close() if err := L.DoFile("sample.lua"); err != nil { panic(err) } t := L.NewTable() t.RawSetString("name", lua.LString(p.Name)) t.RawSetString("given_name", lua.LString(p.GivenName)) t.RawSetString("street", lua.LString(p.Street)) t.RawSetString("postal_code", lua.LString(p.PostalCode)) t.RawSetString("city", lua.LString(p.City)) if err := L.CallByParam(lua.P{ Fn: L.GetGlobal("call_me"), NRet: 1, Protect: true, }, t); err != nil { panic(err) } ret := L.Get(-1) // returned value L.Pop(1) // remove received value fmt.Println("The result of the Lua function is:", ret) } </code>
sample.lua-Datei:
<code>function call_me(tbl) print(tbl.name) print(tbl.given_name) print(tbl.street) print(tbl.postal_code) print(tbl.city) return 0 end </code>
Ergebnis:
Mustermann Max Sackgasse 19 36304 Alsfeld The result of the Lua function is: 0
Das obige ist der detaillierte Inhalt vonWie definiere ich mit gopher-lua eine Lua-Funktion, die eine vordefinierte Tabelle als Parameter verwendet und auf die das Lua-Skript innerhalb der Funktion zugreifen kann?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!