Lua 变量声明与使用

2019-05-04 23:37|来源: 网路

Lua 变量

变量在使用前,必须在代码中进行声明,即创建该变量。

编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。

Lua 变量有三种类型:全局变量、局部变量、表中的域。

Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。

局部变量的作用域为从声明位置开始到所在语句块结束。

变量的默认值均为 nil。

-- test.lua 文件脚本
a = 5               -- 全局变量
local b = 5         -- 局部变量

function joke()
    c = 5           -- 全局变量
    local d = 6     -- 局部变量
end

joke()
print(c,d)          --> 5 nil

do 
    local a = 6     -- 局部变量
    b = 6           -- 全局变量
    print(a,b);     --> 6 6
end

print(a,b)      --> 5 6


执行以上实例输出结果为:

$ lua test.lua 
5	nil
6	6
5	6



赋值语句

赋值是改变一个变量的值和改变表域的最基本的方法。

a = "hello" .. "world"
t.n = t.n + 1


Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。

a, b = 10, 2*x       <-->       a=10; b=2*x


遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:

x, y = y, x                     -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i]         -- swap 'a[i]' for 'a[j]'


当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:

a. 变量个数 > 值的个数             按变量个数补足nil
b. 变量个数 < 值的个数             多余的值会被忽略


例如:

a, b, c = 0, 1
print(a,b,c)             --> 0   1   nil
 
a, b = a+1, b+1, b+2     -- value of b+2 is ignored
print(a,b)               --> 1   2
 
a, b, c = 0
print(a,b,c)             --> 0   nil   nil


上面最后一个例子是一个常见的错误情况,注意:如果要对多个变量赋值必须依次对每个变量赋值。

a, b, c = 0, 0, 0
print(a,b,c)             --> 0   0   0


多值赋值经常用来交换变量,或将函数调用返回给变量:

a, b = f()


f()返回两个值,第一个赋给a,第二个赋给b。

应该尽可能的使用局部变量,有两个好处:

  • 1. 避免命名冲突。

  • 2. 访问局部变量的速度比全局变量更快。


索引

对 table 的索引使用方括号 []。Lua 也提供了 . 操作。

t[i]
t.i                 -- 当索引为字符串类型时的一种简化写法
gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用


例如:

> site = {}
> site["key"] = "www.656463.com"
> print(site["key"])
www.656463.com
> print(site.key)
www.656463.com


相关问答

更多
  • 从Lua使用debug.getinfo,例如, local line = debug.getinfo(1).currentline 从C使用lua_getinfo(这将返回lua代码内的linenumber) lua_Debug ar; lua_getstack(L, 1, &ar); lua_getinfo(L, "nSl", &ar); int line = ar.currentline http://www.lua.org/manual/5.1/manual.html#lua ...
  • 根据你的情况,Lua函数collectgarbage可能对你有用。 请参阅: http : //luatut.com/collectgarbage.html Depending on your situation, the Lua function collectgarbage may be of use to you. See: http://luatut.com/collectgarbage.html
  • a or b不能产生一个意味着“a或b”的值 - 这太复杂了。 事实上,如果你要求它在两个字符串之间进行选择,它将只选择第一个字符串: print("leave cave" or "leave") --> leave cave or仅用于布尔值 - 您必须在多个完整条件下组合它: while (input ~= "leave cave") and (input ~= "leave") do 在这种情况下, repeat ....... until 循环可能会更好地为您服务: repe ...
  • RTFM https://github.com/openresty/lua-nginx-module#ngxvarvariable 读写Nginx变量值。 value = ngx.var.some_nginx_variable_name ngx.var.some_nginx_variable_name = value 请注意,只有已定义的nginx变量可以写入。 例如: location /foo { set $my_var ''; # this line is required to create $my ...
  • 尝试这个: local ret, data = assert(pcall(the_function)) Try this: local ret, data = assert(pcall(the_function))
  • “任何不在定义的块中的变量都被认为是在全局范围内。” 这是完全错误的,所以你的困惑是可以理解的。 看起来你是从用户wiki中获得的。 我刚更新了更正信息的页面: 任何未定义为local变量都是全局变量。 我的理解是,如果我在任何地方“声明”一个变量,它将永远是全球性的 如果你不把它定义为local ,它将是全球性的。 然而,如果你创建一个同名的local ,它将优先于全局(例如,当试图解析一个变量名时,首先是Lua“看到”本地人)。 看到这篇文章底部的例子。 如果我第一次将一个变量定义为本地变量,那么我会一 ...
  • 有几种方法可以做到这一点。 使用当前设置,您可以执行以下操作: a.lua function x() -- _G is the global table. this creates variable 'obs' attached to -- the global table with the value 'some text value' _G.obs = "some text value" end b.lua require "a" function y() print ...
  • ...用于vararg函数 。 它的值是所有“额外”参数的列表(即跟随当前函数的最后一个命名参数的参数)。 (...) (与括号中的任何其他表达式一样)将结果调整为一个值(列表中的第一个值)。 因此if语句实际上意味着“如果存在第一个可变参数并且不是false或nil 。 例子: local function f1(...) if (...) then return true else return false end end local function f2(x, ...) ...
  • 如果我们将您的lua文件看作有向图,其中顶点从依赖关系指向其使用,目标是将图形修改为树或森林,因为您打算摆脱循环。 循环是一组节点,它们在顶点方向上遍历可以到达起始节点。 现在,问题是如何摆脱循环? 答案如下: 让我们考虑节点N,让我们将{D1,D2,...,Dm}视为其直接依赖关系。 如果该集合中没有Di直接或间接依赖于N,那么您可以保留N原样。 在这种情况下,有问题的依赖项集如下所示:{} 但是,如果你有一个非空集,如下所示:{PD1,...,PDk}? 然后,您需要分析1和k之间的PD以及N,并查看每 ...
  • 你把它拼错了。 该错误实际上声称您试图访问“myCirle”,而不是“myCircle”。 You misspelled it. The error actually claims that you attempted to access "myCirle", not "myCircle".