首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lua如何为以前分配的特定局部变量找到正确的值?

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

Stack Overflow用户
提问于 2020-12-31 09:12:45
回答 3查看 299关注 0票数 0

由于全局变量存储在名为_ENV的表中,因此可以以名称作为表的.的键找到它们。

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

编辑:

下面是演示代码:

代码语言:javascript
复制
do
    local a=1;
    local b=2;
    local c=3;
    
    sum = a+c;
end

Lua如何知道变量a的值是1?

EN

回答 3

Stack Overflow用户

发布于 2020-12-31 23:21:57

就像所有的解释语言一样,lua运行在一个“堆栈”之上,这实际上就是它听起来的样子。一种很大很高的内存结构,用来存储lua脚本的全部内存。(“堆栈溢出”一词来自这个内存不足的堆栈)

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

代码语言:javascript
复制
local a = "abc" -- Item #1
local b = "abc" -- Item #2
local c = "abc" -- Item #3

运行此脚本时,lua的内存如下所示:

代码语言:javascript
复制
+-------+
| "abc" |
+-------+
| "abc" |
+-------+
| "abc" |
+-------+

这也是词汇作用域,当您输入do end作用域(或任何作用域)时,Lua将创建堆栈的一个新区域,并在词法作用域离开时丢弃该区域。

代码语言:javascript
复制
local a = "abc"
do
    local b = "xyz"
end

会是这样的:

代码语言:javascript
复制
Before:    In "do":   After:
+-------+  +-------+  +-------+
| "abc" |  | "abc" |  | "abc" |
+-------+  +-------+  +-------+
           +-------+
           | "xyz" |
           +-------+

有趣的是,lua也没有“全局变量”。每个变量都在堆栈上,只是一个表查找。

执行此操作的方式是通过向上值;lua作用域可以访问上面作用域中的局部变量。但是,当您使用load加载一个全新的lua块(函数)时,它没有任何向上值。要实现全局值,所有块都有一个上值_ENV。所有“全局”变量实际上只是这个表上的一个索引。

因为_ENV总是位于堆栈的最底层,所以Lua很容易查找全局。(但速度较慢)

代码语言:javascript
复制
+------+
| _ENV |
+------+
+-------+
| "abc" |
+-------+

最后一个例子:

代码语言:javascript
复制
local a = "abc" -- Item #1
b = "xyz" -- _G["b"] = "xyz"
c = b -- _G["c"] = _G["b"]
local z = "awesome" -- Item #2

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

票数 1
EN

Stack Overflow用户

发布于 2020-12-31 10:54:03

基于LUA参考

除非显式声明为本地变量,否则任何变量名称都被假定为全局变量(见第3.3.7节)。局部变量在词汇上有作用域:局部变量可以通过在其作用域内定义的函数自由访问(见第3.5节)。

因此:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2020-12-31 12:13:10

Normaly局部变量和函数在do ... endfunction(...) ... end中是有意义的。例如,在没有上述规则的情况下,我在安卓上的QLua除了nil之外什么都不打印.

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65518845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档