在查阅相干博客后,我们可以对 Table 的 __newindex 要领的修改,将模块配置为只读模式。
- package main
- import (
- "fmt"
- "github.com/yuin/gopher-lua"
- )
- // 配置表为只读
- func SetReadOnly(l *lua.LState, table *lua.LTable) *lua.LUserData {
- ud := l.NewUserData()
- mt := l.NewTable()
- // 配置表中域的指向为 table
- l.SetField(mt, "__index", table)
- // 限定对表的更新操纵
- l.SetField(mt, "__newindex", l.NewFunction(func(state *lua.LState) int {
- state.RaiseError("not allow to modify table")
- return 0
- }))
- ud.Metatable = mt
- return ud
- }
- func load(l *lua.LState) int {
- mod := l.SetFuncs(l.NewTable(), exports)
- l.SetField(mod, "name", lua.LString("gomodule"))
- // 配置只读
- l.Push(SetReadOnly(l, mod))
- return 1
- }
- var exports = map[string]lua.LGFunction{
- "goFunc": goFunc,
- }
- func goFunc(l *lua.LState) int {
- fmt.Println("golang")
- return 0
- }
- func main() {
- l := lua.NewState()
- l.PreloadModule("gomodule", load)
- // 实行修改导入的模块
- if err := l.DoString(`local m = require("gomodule");m.name = "hello world"`); err != nil {
- fmt.Println(err)
- }
- l.Close()
- }
- // <string>:1: not allow to modify table
写在最后
Golang 和 Lua 的融合,坦荡了我的视野:原本静态说话和动态说话还能这么融合,静态说话的运行高服从,共同动态说话的开拓高服从,想想都欢快(逃。 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|