由于全局变量存储在名为_ENV的表中,因此可以以名称作为表的.的键找到它们。
如何为以前分配的特定局部变量找到正确的值?
编辑:
下面是演示代码:
do
local a=1;
local b=2;
local c=3;
sum = a+c;
endLua如何知道变量a的值是1?
发布于 2020-12-31 23:21:57
就像所有的解释语言一样,lua运行在一个“堆栈”之上,这实际上就是它听起来的样子。一种很大很高的内存结构,用来存储lua脚本的全部内存。(“堆栈溢出”一词来自这个内存不足的堆栈)
在lua编译期间,lua查找局部变量,并在堆栈上为它们分配一个空间:
local a = "abc" -- Item #1
local b = "abc" -- Item #2
local c = "abc" -- Item #3运行此脚本时,lua的内存如下所示:
+-------+
| "abc" |
+-------+
| "abc" |
+-------+
| "abc" |
+-------+这也是词汇作用域,当您输入do end作用域(或任何作用域)时,Lua将创建堆栈的一个新区域,并在词法作用域离开时丢弃该区域。
local a = "abc"
do
local b = "xyz"
end会是这样的:
Before: In "do": After:
+-------+ +-------+ +-------+
| "abc" | | "abc" | | "abc" |
+-------+ +-------+ +-------+
+-------+
| "xyz" |
+-------+有趣的是,lua也没有“全局变量”。每个变量都在堆栈上,只是一个表查找。
执行此操作的方式是通过向上值;lua作用域可以访问上面作用域中的局部变量。但是,当您使用load加载一个全新的lua块(函数)时,它没有任何向上值。要实现全局值,所有块都有一个上值_ENV。所有“全局”变量实际上只是这个表上的一个索引。
因为_ENV总是位于堆栈的最底层,所以Lua很容易查找全局。(但速度较慢)
+------+
| _ENV |
+------+
+-------+
| "abc" |
+-------+最后一个例子:
local a = "abc" -- Item #1
b = "xyz" -- _G["b"] = "xyz"
c = b -- _G["c"] = _G["b"]
local z = "awesome" -- Item #2澄清: lua中的所有操作都在此堆栈上。当您想要调用一个函数-添加两个数字,甚至查找一个表时,所有这些操作都是在lua堆栈上执行的。如果您对此如何工作感兴趣,请查看lua。
发布于 2020-12-31 10:54:03
基于LUA参考
除非显式声明为本地变量,否则任何变量名称都被假定为全局变量(见第3.3.7节)。局部变量在词汇上有作用域:局部变量可以通过在其作用域内定义的函数自由访问(见第3.5节)。
因此:
function printA()
print(a)
end
a = 1
print(a) -- 1
local a = 2
print(a) -- 2
do
print(a) -- 2
local a = 3
print(a) -- 3
end
print(a) -- 2
printA() -- 1发布于 2020-12-31 12:13:10
Normaly局部变量和函数在do ... end或function(...) ... end中是有意义的。例如,在没有上述规则的情况下,我在安卓上的QLua除了nil之外什么都不打印.
Lua 5.2.3 Copyright (C) 1994-2013 Lua.org, PUC-Rio
> local a=1
> local b=2
> print(a,b)
nil nil
> do local a=1 local b=2 print(a,b) end
1 2https://stackoverflow.com/questions/65518845
复制相似问题