| 
                         在查阅相关博客后,我们可以对 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 的融合,开阔了我的视野:原来静态语言和动态语言还能这么融合,静态语言的运行高效率,配合动态语言的开发高效率,想想都兴奋(逃。                         (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |