关于Lua中"local foo = foo"成语的解释

Pie*_*olo 5 lua

在Roberta Ierusalimschy的Lua编程(第3版)中说明了这一点

Lua的一个常见习语是

local foo = foo

此代码创建一个局部变量,foo并使用全局变量的值对其进行初始化foo.(foo只有在声明后,本地变得可见.)当块需要保留原始值时,foo即使稍后某些其他函数改变了全局值,这个习惯用法也很有用foo; 它还加快了访问速度foo.

有人可以更详细地解释这个并提供一个简单的例子吗?

目前,我能想到的唯一用途就是管理与全局变量具有相同名称的局部变量(在给定的块中),以便在块之后保持全局变量不变.

一个例子:

foo = 10
do
   local foo = foo
   foo = math.log10(foo)
   print(foo)
end
print(foo)
Run Code Online (Sandbox Code Playgroud)

这给了:

1
10
Run Code Online (Sandbox Code Playgroud)

但是完全可以在不使用成语的情况下完成:

bar = 10
do
   local bar = math.log10(bar)
   print(bar)
end
print(bar)
Run Code Online (Sandbox Code Playgroud)

这给出了相同的结果.所以我的解释似乎并不成立.

Pau*_*nko 2

解释正确;我不确定您为什么对您的示例不满意。给大家举个真实的例子:

local setfenv = setfenv
if not setfenv then -- Lua 5.2+
  setfenv = function() ..... end
end
Run Code Online (Sandbox Code Playgroud)

另一个原因是保留此时的值,以便使用该值(在文件或模块中)的其他函数对该值具有相同的期望。

  • @PierPaolo,因为更改仅在当前博客中生效。如果你不执行“local setfenv = setfenv”,效果将在当前块之外可见,这在这种情况下是不可取的。 (2认同)