Lua部分迷惑特性大赏

举报
maijun 发表于 2021/08/18 15:59:36 2021/08/18
【摘要】 本文记录部分Lua的特性,会陆续不断更新,作为个人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,我也还没有研究过为什么可以这样,先记录一下。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。