知识点
相关文章
更多最近更新
更多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的行号(current line number in Lua)[2022-02-13]
从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
-
Lua“或”声明问题(Lua “or” statement issue)[2022-04-13]
a or b不能产生一个意味着“a或b”的值 - 这太复杂了。 事实上,如果你要求它在两个字符串之间进行选择,它将只选择第一个字符串: print("leave cave" or "leave") --> leave cave or仅用于布尔值 - 您必须在多个完整条件下组合它: while (input ~= "leave cave") and (input ~= "leave") do 在这种情况下, repeat ....... until循环可能会更好地为您服务: repe ... -
在lua和nginx中使用变量(Use variable in lua and nginx)[2022-04-26]
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 ... -
在Lua中用pcall声明(Use assert with pcall in Lua)[2023-11-01]
尝试这个: local ret, data = assert(pcall(the_function)) Try this: local ret, data = assert(pcall(the_function)) -
lua变量作用域(lua variables scope)[2022-02-10]
“任何不在定义的块中的变量都被认为是在全局范围内。” 这是完全错误的,所以你的困惑是可以理解的。 看起来你是从用户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 ...
-
在Lua声明如果奇怪(Strange if statement in Lua)[2022-03-10]
...用于vararg函数 。 它的值是所有“额外”参数的列表(即跟随当前函数的最后一个命名参数的参数)。 (...) (与括号中的任何其他表达式一样)将结果调整为一个值(列表中的第一个值)。 因此if语句实际上意味着“如果存在第一个可变参数并且不是false或nil 。 例子: local function f1(...) if (...) then return true else return false end end local function f2(x, ...) ... -
Lua Spaghetti模块(Lua Spaghetti Modules)[2022-10-05]
如果我们将您的lua文件看作有向图,其中顶点从依赖关系指向其使用,目标是将图形修改为树或森林,因为您打算摆脱循环。 循环是一组节点,它们在顶点方向上遍历可以到达起始节点。 现在,问题是如何摆脱循环? 答案如下: 让我们考虑节点N,让我们将{D1,D2,...,Dm}视为其直接依赖关系。 如果该集合中没有Di直接或间接依赖于N,那么您可以保留N原样。 在这种情况下,有问题的依赖项集如下所示:{} 但是,如果你有一个非空集,如下所示:{PD1,...,PDk}? 然后,您需要分析1和k之间的PD以及N,并查看每 ... -
lua变量闭合(lua variable closure)[2022-07-13]
你把它拼错了。 该错误实际上声称您试图访问“myCirle”,而不是“myCircle”。 You misspelled it. The error actually claims that you attempted to access "myCirle", not "myCircle".