Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah cara saya menggunakan gopher-lua untuk mentakrifkan fungsi Lua yang mengambil jadual pratakrif sebagai parameter dan skrip Lua boleh mengakses dalam fungsi itu?

Bagaimanakah cara saya menggunakan gopher-lua untuk mentakrifkan fungsi Lua yang mengambil jadual pratakrif sebagai parameter dan skrip Lua boleh mengakses dalam fungsi itu?

PHPz
PHPzke hadapan
2024-02-09 20:57:08889semak imbas

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

Editor php Xiaoxin akan memperkenalkan kepada anda cara menggunakan gopher-lua untuk mentakrifkan fungsi dengan parameter jadual yang dipratentukan dalam fungsi Lua, dan mengakses jadual di dalam fungsi tersebut. gopher-lua ialah penterjemah Lua yang dilaksanakan dalam bahasa Go, yang boleh membenamkan dan melaksanakan skrip Lua dalam program Go. Melalui reka bentuk dan penggunaan kod yang munasabah, kami boleh mencapai matlamat ini dengan mudah. Seterusnya, kami akan menerangkan secara terperinci cara melakukan ini.

Kandungan soalan

Saya tahu cara mentakrifkan fungsi Go dan menjadikannya global (Contoh dua kali dalam dokumentasi). Tetapi bagaimana jika parameter fungsi ini mestilah jadual yang telah ditetapkan?

function calling_this_function_would_be_required(predefined_table)
  print(predefined_table["something"])
end

Pelayan IMAP Dovecot menyediakan sesuatu seperti di atas: https://doc.dovecot.org/configuration_manual/authentication/lua_based_authentication/#examples

Saya juga ingin menyediakan fungsi yang telah ditetapkan dengan jadual (atau bahkan data pengguna). Tetapi saya tidak tahu bagaimana untuk mencapai ini.

Membuat jadual global adalah mudah (L.SetGlobal(...)), tetapi bagaimana anda menambahkannya pada fungsi yang diharapkan?

Tambah beberapa fungsi dalam Go

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)) 
}

Alangkah baiknya jika seseorang boleh memberi saya sedikit inspirasi :-) Terima kasih terlebih dahulu

Penyelesaian

Berdasarkan jawapan @koyaanisqatsi, saya mengetahui cara untuk menjadikannya berfungsi dalam Go.

Go contoh kod:

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

fail sampel.lua:

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

Hasil:

Mustermann
Max
Sackgasse 19
36304
Alsfeld
The result of the Lua function is: 0

Atas ialah kandungan terperinci Bagaimanakah cara saya menggunakan gopher-lua untuk mentakrifkan fungsi Lua yang mengambil jadual pratakrif sebagai parameter dan skrip Lua boleh mengakses dalam fungsi itu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam