Wie 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?

PHPz
Freigeben: 2024-02-09 20:57:08
nach vorne
905 Leute haben es durchsucht

如何使用 gopher-lua 定义一个 Lua 函数,该函数有一个预定义的表作为参数,Lua 脚本可以在该函数中访问该表?

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.

Frageninhalt

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
Nach dem Login kopieren

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)) 
}
Nach dem Login kopieren

Es wäre toll, wenn mir jemand Inspiration geben könnte :-) Vielen Dank im Voraus

Workaround

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Ergebnis:

Mustermann
Max
Sackgasse 19
36304
Alsfeld
The result of the Lua function is: 0
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!