Heim >Backend-Entwicklung >Golang >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?

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
PHPznach vorne
2024-02-09 20:57:08979Durchsuche

如何使用 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

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

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>

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen