我最近从Lua 5.2.3升级到5.3.1但我注意到string.format如果它尝试格式化float使用我的所有脚本执行开始失败%d
local anExampleString = string.format("Sample Number: %d",10.100000001) -- Fails on 5.3.1, works on 5.2.3
local aWorkingString = string.format("Sample Number: %.0f",10.100000001) -- Works on 5.3.1
Run Code Online (Sandbox Code Playgroud)
这是设计的吗?我似乎无法在任何地方找到变更记录.
在Lua 5.3中,C API中的表相关函数接收和返回lua_Integer.
void lua_rawgeti (lua_State *L, int idx, lua_Integer n);
void lua_rawseti (lua_State *L, int idx, lua_Integer n);
lua_Integer luaL_len (lua_State *L, int index);
Run Code Online (Sandbox Code Playgroud)
但是,lua_createtable仍然收到int.
void lua_createtable (lua_State *L, int narr, int nrec);
Run Code Online (Sandbox Code Playgroud)
在下面的示例函数中,源表的长度用于创建大小相同的副本.
static int copy_sequence(lua_State *L) {
lua_Integer len, i;
luaL_checktype(L, 1, LUA_TTABLE);
len = luaL_len(L, 1);
lua_createtable(L, (int)len, 0); /* conversion warning */
for (i = 1; i <= len; i++) {
lua_rawgeti(L, 1, i);
lua_rawseti(L, -2, i);
}
return …Run Code Online (Sandbox Code Playgroud) 我使用 Lua 作为我的项目的配置格式。假设我有以下人为示例,我们将调用conf.lua:
title = "Lorem Ipsum"
author = "John Doe"
date = "01 January 2000"
Run Code Online (Sandbox Code Playgroud)
现在,很简单,我当然可以像这样加载这个文件:
dofile("conf.lua")
Run Code Online (Sandbox Code Playgroud)
但是,问题在于这些定义是在全局命名空间中设置的,这是我不想要的。此外,这使得访问不同的变量作为一个整体变得困难(例如循环配置变量集)。一种解决方案是conf.lua像这样重写:
local conf = {
title = "Lorem Ipsum",
author = "John Doe",
date = "01 January 2000"
}
return conf
Run Code Online (Sandbox Code Playgroud)
依次加载conf.lua以下代码:
local configuration = dofile("conf.lua")
Run Code Online (Sandbox Code Playgroud)
但是,由于我认为显而易见的原因,这并不理想。它要求我的用户跟踪逗号,必须写local,必须记住在最后返回表。如果有某种方法可以conf.lua使用某种自定义范围来执行,那将会是一件好事。