Lua 为什么需要在awesome wm模块中重新定义标准变量?

Lua 为什么需要在awesome wm模块中重新定义标准变量?,lua,awesome-wm,Lua,Awesome Wm,任何令人敬畏的wm模块都从重新定义标准变量到局部变量开始。诸如此类 local table = table local string = string local tostring = tostring 它有什么作用?删除这行代码后,所有代码仍能正常工作。这纯粹是一个优化问题。局部变量的读/写速度比全局变量快。这在一定程度上是因为全局变量是哈希表查找(例如,foo=>\g[“foo”]),局部变量是VM寄存器查找。因此,对于将大量使用全局变量通过局部变量对其进行别名的模块来说,这并不少见 对于

任何令人敬畏的wm模块都从重新定义标准变量到局部变量开始。诸如此类

local table = table
local string = string
local tostring = tostring

它有什么作用?删除这行代码后,所有代码仍能正常工作。

这纯粹是一个优化问题。局部变量的读/写速度比全局变量快。这在一定程度上是因为全局变量是哈希表查找(例如,
foo
=>
\g[“foo”]
),局部变量是VM寄存器查找。因此,对于将大量使用全局变量通过局部变量对其进行别名的模块来说,这并不少见

对于您的代码,除非您知道某些东西将被称为一吨,并且将成为瓶颈,否则我不会使用这种技术。Lua不是C。你在用表现换取简洁和清晰。不要把它换回来。

已经回答了“它能做什么”


对于“why is done”(为什么要这样做):在awesome支持lua 5.2(没有弃用的函数)之前,所有模块都使用lua的module()函数进行设置。这意味着全局变量的值变得不可访问,而这种“局部技巧”实际上是必要的。

我同意这里的一切,除了“不要因为权衡而这样做”这一点。除了这个最初的问题,它不会以任何方式损害清晰性,只会略微损害简洁性(特别是当多个赋值在同一行上时),并且通常会对经常运行或在循环中运行的代码产生真正可测量的(尽管通常很小)影响。它也有助于形成使用局部变量而不是全局变量的模式,这通常可以避免许多潜在的陷阱和问题。@EtanReisner如果您担心非关键路径Lua代码的性能会有小幅度的提高,那么您使用的语言是错误的。绝大多数Lua代码都不应该将它们使用的所有库例程别名化为局部变量。这种思维方式的逻辑结论是避免,比如说,
s:gsub(…)
,因为它不仅是一种表查找,而且是一种元表查找(哦,天哪!),所以应该编写“local gsub=string.gsub;”然后在文件的顶部
gsub(s…)
,对吗?不。你应该专注于解决你的问题,然后是清晰,而不是使用Lua的开销。我是说担心吗?我说它有真正的影响。我也没有说你应该这样做,排除所有的理智或lua标准操作。我说,认为你不应该这样做,因为这是不成熟的,而且会严重损害清晰性和简洁性,这是一个站不住脚的论点,使用它会强化良好的lua实践。“我说它有真正的影响。”作为一种习惯,这样做是不成熟的。如果你已经确定“它有真正的影响”(你的话),那么“你应该做”(我的话),因为这不是过早的。我在Lua邮件列表上活跃了十年,多年来一直在Lua进行专业编码;在不需要的时候,习惯性地、反射性地别名库例程并不是“良好的Lua实践”的问题。不,良好的实践是使用局部变量。这是lua的新来者经常犯的错误之一。因此,一个简单的实践,在某些情况下既有利于运行,又没有真正的清晰性或简洁性成本,并且灌输给他们使用局部变量的习惯,就我而言,这是一件好事(tm)。尽管如此,我绝对不会把它作为第一个建议/评论,但这与积极推荐远离它的人相去甚远。