David Manura |
|
这里有一些我参与过的 Lua wiki 页面和项目。
代码和项目
Bit
Op 'bit' 兼容接口。
checkglobals
函数是 etc/strict.lua
和 luac -p -l - | lua test/globals.lua
的替代方案。
一般主题、模式、技巧和设计
module
函数
Library 模块加载问题的讨论
其他文档的评论/注释
这里有一些困扰我的事情,虽然我不确定是否要对所有事情都采取行动。
f(...)
重构为 local ok, err = pcall(f, ...); if not ok then error(err) end
或 assert(pcall(f, ...))
会对回溯行为产生副作用。 LuaList:2012-02/msg00858.html
error
函数中使用的 level
参数缺乏可维护性,因为函数可能从不同的级别调用,而这些级别可能被重构。将 f()
重构为 (function() return f() end)()
会对级别行为产生副作用,并且没有选项可以抑制堆栈级别的更改。 LuaCarp 是早期改进此问题的尝试。另请参见 [6][7]。至少在 5.2 版本中,getfenv/setfenv 大部分被移除,模块中的 setfenv 行为已弃用,因此它正在朝着正确的方向发展。
assert
函数的命名可能存在争议: [8]。此外,失败表达式始终会被评估。
_ENV = require '_G53'
?
local ok, err = f(); if not ok then return ok, err end
是一个常见的习惯用法。应该缩短它吗?
printf "${x},${y},${x}"
的内容扩展为 printf("${x},${y},${x}", x, y, x)
,然后在运行时进行评估,可能是一个不错的折衷方案。
local two local function one() two() end function two() one() end -- forward declared local (misleadingly looks like global)
package.path
和 package.cpath
是字符串而不是数组。 LuaList:2010-06/msg00214.html 。这导致了“lib”模块 [4]。
for _,v in ipairs(t) do
很丑,而且它比 for i=1,#t do local v=t[i] do
效率低。这两种形式在 __len
方面也没有相同的行为。
免责声明:以下列表可能未完全更新以反映最终的 5.2.0 版本,可能需要进一步清理。
这些我想要的变化包含在 5.2 工作版本中 (LuaFiveTwo)
Op 达成一致(由 Lua
JIT 支持,取代了 lbitlib)。参见 位运算符/[5] 5.2 和 LuaJIT 位库对于大多数目的来说可能都很好,并且可以编写与两者兼容的代码:`local band = bit.band or bit32.band`,只要你避免不兼容的情况。应该添加获取/设置位域操作吗? [17]
hex 'cdef'
或 binary '0101'
,但为什么需要这样做呢。
以下是 5.2 中未解决的其他旧想法,我还没有决定将它们提升到 5.3 的愿望清单
...
的操作有些笨拙,除非你把它复制到一个表中(效率不高)并正确处理nil
。另见 VarargTheSecondClassCitizen。类似于提议的 #... 和 ...[i] 会有所帮助,尽管这种语法存在问题。Roberto 在这里总结了困境:LuaList:2010-06/msg00434.html。尽管如此,一些小的改进可能是可能的。
lua_createtable
[34]。有关预分配的信息,请参见 TablePreallocation(不讨论清除)。
x*x
通常比 x^2
快,因为 Lua 无法在编译时将后者简化为前者(想想:x
可能有一个 __pow
元方法)。宏处理可以缓解这种情况(例如,“将“y = SQUARE(x+y) + 1”转换为“y = (let t1 = x+y in t*t) + 1”)。另请参见 LuaJIT 和 LuaToCee。全局,或者至少是整个文件,流分析可以在这里提供帮助。