Lua部分迷惑特性大赏
本文记录部分Lua的特性,会陆续不断更新,作为个人Lua笔记记录,并不系统(主要并不是单单进行Lua开发使用,而是针对Lua源码进行解析分析时使用,因此记录的是容易疑惑的特性)。
1. table 属性操作和访问
先上代码:
local t = {}
local a = "abc"
t.a = 3
t.abc = 5
print(t[a]) -- 5
print(t.a) -- 3
print(t["a"]) -- 3
print(t["abc"]) -- 5
上面的代码里面,是针对表中的属性的赋值和取值的操作。
对表属性,有 点操作符 和 []操作符,点操作符 后面,是直接的 字符串,而 []操作符里面,则是 字符串,如上 t.a 相当于 t["a"]
2. 表(模块)函数调用
先上代码:
local a = {}
a.x = "a.x"
a.px = function(self)
print(self.x)
end
local b = {}
b.x = "b.x"
-- a.px() will report an error
a.px(a) -- a.x
a.px(b) -- b.x
a:px() -- a.x
a:px(a) -- a.x
a:px(b) -- a.x
如上,表 函数调用,有两种方式:点 和 冒号。点和冒号的区别在于:冒号调用自带 self 属性,而 点 调用则没有 self 属性。
3. 局部变量作用域
Lua 变量有三种类型:全局变量、局部变量、表中的域。局部变量的作用域为从声明位置开始到所在语句块结束。
下面通过两段代码,给大家感受下局部变量作用域:
代码1(最终调用的 test() 方法,打印 x 的值为 4):
local x = 9
local function test()
print(x)
end
x = 4
test()
代码2(最终调用的 test() 方法,打印的x的值为9):
local x = 9
local function test()
print(x)
end
local x = 4
test()
说明:
在代码1中,第一行,定义的本地变量 x,作用域为整个文件。test() 方法中,x 引用的是 第一行定义的 x。倒数第2行,对x修改,也是修改的第一行定义的x。
在代码2中,因为在文件作用域,定义了两个同名的 本地变量 x,而 test() 方法中,x引用的是 第一行定义的x。
4. 函数返回值
4.1 无return函数返回值
首先我们看下面的代码:
local function a()
print("hello")
end
local x = a("hello")
print(x)
上面,控制台输出如下:
hello
nil
如上,虽然函数 a() 没有返回值,我们仍然可以将 函数 a() 调用赋值给某个变量,并且打印出来的是 nil。因此,在 lua 中,任何的函数都会有返回值,如果没有显示设置,则返回值为 nil。
4.2 返回值赋值
我们关注下面的几个例子:
function test()
return 1, 2
end
function no_return()
-- empty
end
-- 场景1:Lua返回有多个值的情况:接收的变量和返回的变量一一对应,
-- 如果接收的变量多,则后面的变量被赋值为 nil,如果函数返回的值多,则多余的值被忽略。
a1 = test()
print(a1) -- 1
a1, b1, c1 = test()
print(a1, b1, c1) -- 1, 2, nil
-- 场景2: 如果Lua函数调用赋值也是在一个列表里面,则区分是否为最后一个变量,
-- 如果不是最后一个变量,则只返回第一个变量,如果是最后一个变量,后面的变量依次赋值。
a2, b2 = test(), test()
print(a2, b2) -- 1, 1
a3, b3, c3 = test(), test()
print(a3, b3, c3) -- 1, 1, 2
a4, b4, c4, d4 = test(), test()
print(a4, b4, c4, d4) -- 1, 1, 2, nil
-- 场景3: 进一步佐证 没有设置 return 的函数,仍然是有返回值,并且为 null。
a5, b5, c5, d5 = test(), no_return(), test()
print(a5, b5, c5, d5) -- 1, nil, 1, 2
相关解释,参考上面的例子的注释。
5. 有个神奇的Return用法
看下面的代码片段:
for x=1,10,1 do
print(x)
return
print(x+1)
end
这段代码,并不会报错,打印的结果如下:
1
2
我使用的 lua 版本是 5.3,我也还没有研究过为什么可以这样,先记录一下。
- 点赞
- 收藏
- 关注作者
评论(0)