永发信息网

如何在 Lua 注册表中选择一个合适的 Key

答案:1  悬赏:40  手机版
解决时间 2021-03-04 19:59
如何在 Lua 注册表中选择一个合适的 Key
最佳答案
为了让各个 C 扩展库之间可以相安无事的工作,并且对注册表的操作又有较高效率。Lua 大神 Roberto 在神作Pil里给出了一个简洁的方案:
用 static 变量的地址作为 key。
静态变量在当前进程中一定拥有惟一的地址,且 lightuserdata 作 key 非常高效。这无疑是一个好方法。
但是,当模块的源码规模变大了以后,我们将代码分散到不同的源文件中。或者几个子模块需要相互协作时。这个方法就有了一定的缺陷。那就是,必须将这个静态变量暴露出来供大家蹂躏;或是写一个内部函数来取得它(其实没有本质区别)。
如果你也碰到这类问题,不妨看看下面的解决方案。
我们可以在子模块间约定一个字符串,比如 "foobar" 。如果能保证字符串惟一,直接用这个字符串做 key 当然也可以。不过效率稍微低了一点。(字符串压栈要多做一次 hash)。但是 lua 的虚拟机可以保证,只要字符串还有人引用,那么字符串对象就永远只有一份放在内存中,且不会被移动。
所以,只要保证这个字符串从未被回收,
lua_tostring
的结果就永远是一致的。
明白了吗?每个子模块只要在初始化的时候,顺着调用:
lua_pushstring(L,"foobar");
key=lua_tostring(L,-1);
就可以保证得到的 key 是惟一地址了。
当然,你依然得谨慎选择字符串防止冲突。并且要自己在一个绝对安全的地方对这个字符串做至少一次引用。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
从太和县旧县镇到阜阳袁寨镇
雨伞能不能倒挂在店辅
如果微信被拉黑,会出现什么现象
厦大双学位问题
【跟我学游泳】作文跟我学游泳800字以上
泰剧 男主是盲人,女好像是女仆,求名字
我的电脑i7,8g内存,用起很卡,怎么回事
从观音桥坐轻轨到六公里要多久
支付宝转账怎么能收回来?
由0,1,2,3,4,5这六个数字组成的不重复的六位
为什么会长肥胖纹
人踩上狗屎是好还是坏处
东莞清溪哪里可以配摩托车钥匙?
上海居住证积分 每年都需要重新申请一次吗?
奥特曼act掉漆了应该用什么东西补?
推荐资讯
单选题下列物质中既含有化合物又含有单质的是
产径水库地址在什么地方,想过去办事
我还是初二个学生 该怎么处理同学间的关系啊
中国移动和生活里面的滚熊猫咋个弄
龙泉市民政局婚姻登记处在哪里啊,我有事要去
淙有什么形近字
今生良缘珠宝地址有知道的么?有点事想过去
下列关于货物招标投标的说法,正确的是(  
好实惠宁都自助餐馆我想知道这个在什么地方
"虐"字粤语怎么读?
伴君如伴虎这话 出自哪个朝代谁人之口
天天待家里 一点进步都没有
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?