前言
H同学本来是做Java后端开发的,因为项目需要,所以需要学习 Lua 和 erlang 这两种语言。对于之前并没有接触过这块的人来说,还是走出了自己的舒适区的。
lua作为一种脚本语言,和现在流行的python很像,所以如果有相关经验的话,其实还是比较好接受的。
语法入门
输出
print("hello world!")
这里,每行结束并没有强制使用 分号";"来作为结尾,默认换行就是一行的结束
注释
- “--” 作为单行注释
--这是单行注释
- “--[[XXXXXX]]”作为多行注释
--[[
多行注释
--]]
这里有个注意点,多行注释的时候,在一行使用三个减号,即“---”就是取消多行注释,这是比较方便的一个点
标识符
这块的话几个语言基本都是差不多的,就不列举了,感兴趣的话可以自己去看看。
变量
- 默认变量都是全局变量
- 局部变量则使用 local 进行修饰
- 所有变量再一开始都是nil,未声明的时候直接使用就是nil
- 不需要声明变量的类型,这点和python一样,对变量重新复制,其类型就自动转换成新的类型,和Java等强类型语言不同
数据类型
- nil 空,在条件表达式里面等效于false,type(nil)是字符串类型的
- boolean 布尔类型,为 true 和 false
- number 双精度类型的实浮点数,没有 int 和 double 这些,就是 number 类型
- string 字符串类型,用引号括起来.对于跨越多行的字符串,也可以使用[[xxx]]括起来。另外,还需要注意,对于数字的字符串,会自动转换成number类型。字符串之间可以用 .. 进行连接,类型会自动转换,这点和java等类似。井号#可以获取字符串的长度strLen = #"string"
- userdata 表示任意存储在变量中的C数据结构
- thread 表示执行的独立线路,用于执行协同程序,在协同程序的时候使用
- table 其实是一个"关联数组"(associative arrays),有点像是Python的字典,但又有点区别,用{}表示。
table
我觉得有点像是数组和字典的结合,可以没有key,默认索引从1开始。
tab = {"阿里","腾讯","京东"}
for key, val in pairs(tbl) do -- 这里的迭代可以先看着
print("Key", key)
end
-- [[
返回的结果
Key 1
Key 2
Key 3
]]
我们也可以指定其键值对,就像map一样。
tab = {key1="阿里",key2="腾讯",key="京东"}
for key, val in pairs(tab) do -- 这里的迭代可以先看着
print(key .. " - " .. val)
end
-- [[
返回的结果
key1 - 阿里
key - 京东
key2 - 腾讯
]]
我们还可以混合使用,下面给大家看一个有趣的:
tab1 = { key1 = "val1", key2 = "val2", "val3", "val4", 6}
tab1[5] = "val5"
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
print("tab1的长度为:"..#tab1)
print("======")
tab1[4] = 1
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
print("tab1的长度为:"..#tab1)
-- [[
返回的结果
1 - val3
2 - val4
3 - 6
5 - val5
key2 - val2
key1 - val1
tab1的长度为:3
======
1 - val3
2 - val4
3 - 6
4 - 1
5 - val5
key2 - val2
key1 - val1
tab1的长度为:5
]]
从上面可以看出几点:
- 可以混用,毕竟对于没有指定key的会默认使用数字,且从1开始
- 可以通过tab[x] = xx的方式来赋值
- #tab计算长度的时候,是根据数字key来给出的,并且一旦值为nil就断了。所以一开始因为是1-3,然后4不存在,5虽然存在也直接输出了3.在给出4的值之后,就输出长度为5
这里还有坑,就是当指定的key,那么我们可以使用tab1.key1来获取值,但是不能tab1.1这种。