Lua如何为之前分配的特定局部变量找到正确的值?

Lua如何为之前分配的特定局部变量找到正确的值?,lua,Lua,由于全局变量存储在名为\u ENV的表中,它们可以通过名称作为表的键找到。 Lua如何为以前分配的特定局部变量找到正确的值 编辑: 以下是演示代码: do local a=1; local b=2; local c=3; sum = a+c; end Lua如何知道变量a的值为1?根据: 除非明确声明为局部变量(见§3.3.7),否则任何变量名称均假定为全局变量。局部变量具有词汇范围:局部变量可由其范围内定义的函数自由访问(见§3.5) 因此: 函数p

由于全局变量存储在名为
\u ENV
的表中,它们可以通过名称作为表的键找到。

Lua如何为以前分配的特定局部变量找到正确的值

编辑:

以下是演示代码:

do
    local a=1;
    local b=2;
    local c=3;
    
    sum = a+c;
end
Lua如何知道变量
a
的值为1?

根据:

除非明确声明为局部变量(见§3.3.7),否则任何变量名称均假定为全局变量。局部变量具有词汇范围:局部变量可由其范围内定义的函数自由访问(见§3.5)

因此:

函数printA()
印刷品(a)
结束
a=1
印刷品(a)--1
局部a=2
印刷品(a)--2
做
印刷品(a)--2
局部a=3
印刷品(a)--3
结束
印刷品(a)--2
printA()--1

正常的局部定义变量和函数在
do中是有意义的。。。结束
函数(…)。。。结束
。例如,在没有上述规则的情况下,android上我的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       2

与所有解释语言一样,lua运行在“堆栈”的顶部,这与它听起来的完全一样。一个大而高的内存结构,存储lua脚本的全部内存。(术语“堆栈溢出”来自内存不足的堆栈)

在lua编译期间,lua查找局部变量,并在堆栈上为它们分配一个空间:

local a=“abc”--第1项
本地b=“abc”--第2项
本地c=“abc”--第3项
运行此脚本时,lua的内存如下所示:

+-------+
|“abc”|
+-------+
|“abc”|
+-------+
|“abc”|
+-------+
这也是词汇作用域,当您输入
do end
作用域(或任何作用域)时,Lua将创建堆栈的一个新区域,并在保留词汇作用域时丢弃该区域

local a=“abc”
做
本地b=“xyz”
结束
看起来像这样:

之前:在“do”中:之后:
+-------+  +-------+  +-------+
|“abc”| |“abc”| |“abc”|
+-------+  +-------+  +-------+
+-------+
|“xyz”|
+-------+
有趣的是,lua也没有“全局变量”。每个变量都在堆栈上,只是一个表查找

执行此操作的方式是通过upvalues;lua作用域可以访问其上方作用域中的局部变量。但是,当您使用
load
加载一个全新的lua块(函数)时,它没有upvalue。为了实现globals,所有块都有一个upvalue,
\u ENV
。所有“全局”变量实际上只是这个表上的一个索引

由于_ENV始终位于堆栈的最底部,因此Lua很容易查找全局变量。(但速度较慢)

+------+
|_ENV|
+------+
+-------+
|“abc”|
+-------+
最后一个例子:

local a=“abc”--第1项
b=“xyz”---\u G[“b”]=“xyz”
c=b--_G[“c”]=_G[“b”]
local z=“awesome”--第2项

澄清一下:lua中的所有操作都在此堆栈上。当您想要调用一个函数-添加两个数字,甚至查找一个表时,所有这些操作都在lua堆栈上执行。如果您对它的工作原理感兴趣,请查看luaapi。

我明白了。由于全局变量存储在名为_ENV的表中,因此可以通过名称作为表的键找到它们。Lua如何为以前分配的特定局部变量找到正确的值?不知道如何做到这一点。没有do end或在主线程中的函数中的本地定义的东西对我来说意味着:输入垃圾收集器-一个例外可能是_index metamethod,您可以在其中存储不可见的内容,以正常方式列出表。-示例:
setmetatable({u ENV,{{u index={a=1,b=2,c=3}})
-然后删除您的全局a b和c
a=empty b=empty c=empty
并尝试:
打印(a,b,c)
。由于全局变量存储在名为_ENV的表中,因此可以通过名称作为表的键找到它们。Lua如何为以前分配的特定局部变量找到正确的值?感谢您的详细解释。您可以看到“全局”变量是通过名为“\u ENV”的表的键找到的。Lua VM如何知道您前面提到的局部变量(即局部
a
b
c
)的值。)