我们中的许多人都被灌输使用XML来存储数据.它的好处和缺点是众所周知的,我当然不想在这里讨论它们.但是在我用C++编写的项目中,我也使用了Lua.我很惊讶Lua可以用来存储和处理数据.然而,至少在游戏编程世界中,Lua的这一方面不太被认可.
我知道XML在诸如通过互联网发送数据的情况下以及在安全起作用的地方(例如使用从网络下载的数据,或加载用户可编辑的配置文件)以及最后的情况下具有优势.不同语言的程序正在读取相同的数据.
然而,一旦我学会了使用Lua处理数据是多么好和容易(特别是让luabind支持你!),我开始怀疑是否有任何理由使用XML来存储游戏数据,如果我们已经使用了Lua呢?
暴雪在使用Lua编写UI脚本时,仍然以XML格式存储布局.是什么原因只有UI相关?
使用Lua作为数据存储语言有什么缺点?
是否有一些库或项目像Zookeeper一样工作,但没有java依赖?我正在考虑将它放在嵌入式Linux系统上,并且需要最小的占用空间......比如兆字节或更少.我有Lua,C和C++运行时,如果必须的话,可以把NewLISP放在那里.大多数或所有客户端都是C或C++,为了shell脚本的利益,一个很好的命令行实用程序也很有用. http://zookeeper.apache.org/
哪个是最有效的方法来舍入一个数字然后截断它(在四舍五入后删除小数位)?
例如,如果小数大于0.5(即0.6,0.7等),我想向上舍入然后截断(情况1).否则,我想截断(案例2)
for example:
232.98266601563 => after rounding and truncate = 233 (case 1)
232.49445450000 => after rounding and truncate = 232 (case 2)
232.50000000000 => after rounding and truncate = 232 (case 2)
Run Code Online (Sandbox Code Playgroud) 我必须执行以下代码:
local filename = dir .. "/" .. base
Run Code Online (Sandbox Code Playgroud)
循环中数千次(这是一个打印目录树的递归).
现在,我想知道Lua是否一次性连接3个字符串(dir,"/",base)(即通过分配足够长的字符串来保存它们的总长度),或者它是否通过在内部执行它来实现这种效率低下的方式两个步骤:
local filename = (dir .. "/") -- step1
.. base -- step2
Run Code Online (Sandbox Code Playgroud)
最后一种方式是内存方式效率低下,因为分配了两个字符串而不是一个字符串.
我不太关心CPU周期:我主要关心内存消耗.
最后,让我概括一下这个问题:
Lua在执行以下代码时是否只分配一个字符串或4?
local result = str1 .. str2 .. str3 .. str4 .. str5
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我知道我能做到:
local filename = string.format("%s/%s", dir, base)
Run Code Online (Sandbox Code Playgroud)
但我还没有对它进行基准测试(内存和CPU方面).
(顺便说一句,我知道table:concat().这会增加创建表的开销,所以我猜它在所有用例中都不会有用.)
奖金问题:
如果Lua没有优化".."运算符,那么定义用于连接字符串的C函数是否是一个好主意,例如utils.concat(dir, "/", base, ".", extension)?
Lua有#运算符来计算用作数组的表的"长度".我检查了这个操作员,我感到很惊讶.
这是代码,我让它在Lua 5.2.3下运行:
t = {};
t[0] = 1;
t[1] = 2;
print(#t); -- 1 aha lua counts from one
t[2] = 3;
print(#t); -- 2 tree values, but only two are count
t[4] = 3;
print(#t); -- 4 but 3 is mssing?
t[400] = 400;
t[401] = 401;
print(#t); -- still 4, now I am confused?
t2 = {10, 20, nil, 40}
print(#t2); -- 4 but documentations says this is not a sequence?
Run Code Online (Sandbox Code Playgroud)
有人可以解释规则吗?
我想知道是否有办法获取当前正在执行的lua脚本文件的路径?
这特别不是当前的工作目录,可能完全不同.我知道luafilesystem会让我获取当前的工作目录,但它似乎无法告诉当前正在执行的脚本文件.
谢谢
编辑:我没有从标准命令行解释器运行,我正在通过luabind从C++二进制文件执行脚本.
我安装http-lua-module了nginx,制作了一个完美无缺的脚本,但现在我想确定nginx 使用LuaJit而不是Lua(因为我的研究显示LuaJit更快).
我添加到.bushrc那些代码行:
export LD_LIBRARY_PATH=/usr/local/luajit/lib:$LD_LIBRARY_PATH
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0
Run Code Online (Sandbox Code Playgroud)
我也重新编译了nginx,现在我只想确保它使用LuaJit.
使用可嵌入编程语言的典型用例是什么?我是否正确理解这种语言是否应嵌入到某些程序环境中并且应该能够从那里执行?
我一直在努力为此寻找答案但却没有这样做.我想知道,实际使用的do-end块是什么?它只是说在我的书中需要时使用值,所以我怎么能用它呢?
我是否通过在do-end循环中放置一个函数并将局部变量放在函数外但在此do-end块内部并且函数可以看到变量来使用它来减少局部变量的范围?但那么功能仍然可以调用吗?
很抱歉非常模糊.我希望这是有道理的.也许一个插图的例子可能有用^^