Lua笔记(1)

时间:2023-03-09 04:40:38
Lua笔记(1)

今天开始学习Lua,下面把一些重点记下来:

单行注释-- ,多行注释 --[[  .......  --]]

Lua中false和nil表示条件判断的假,其余的,包括空字符串,0,都表示真。

Lua没有整数,都是浮点数

字符串

Lua字符串不能直接修改,字符串可以用单引号或者双引号引住,反斜杠转义

字符串转数字 print(“10” + 1 ) 输出11,而不是输出101(不是数字转字符串)

字符串连接用.. 符号。 print(10 . 20) 输出1020,数字先转成字符串,再连接

尽量不要依赖这些隐式转换,因为有时候会很奇怪,例如  10 == “10” 会返回false。用tonumber, tostring函数

#“字符串” 表示字符串的长度

表与c++的map类似,是一种广义数组

a = {} 创建一个表

a["abc"] = 10 添加元素

注意变量a仅仅是存放了对这个table对象的引用,所以b = a 是引用赋值,而不是把整个表复制

a["abc"] = 10 等价于 a.abc = 10 但不等于 a[abc]

a[10]  与 a["10"] 是不一样的! 谨慎起见可以用a[tonumber("10")]

访问不存在的索引(访问 a[12345] 但之前未对 a[12345] 赋值)统一返回nil,不会报错。由此得出删除一条记录的方法就是给它赋值nil。

days = {"Monday", "Tuesday"} 会把days[1] 初始化为“Monday”, days[2] 初始化为"Tuesday"。从中可以看出Lua数组索引一般从1开始。

表可以嵌套。例如: polyline = {color = "blue", {x=0,y=0},{x=-10,y=0}}。 于是polyline[1] 就是{x=0,y=0}这个表。

a = {[1] = "1", [2] = "3"}这样初始化之后,a[1] 的值为"1", 由此可见数字索引初始化的方法。

a = {x = "abc"} 等价于 a = {["x"] = "abc"}

days = {"Monday", "Tuesday"} 会把days[1] 初始化为“Monday”, days[2] 初始化为"Tuesday"。从中可以看出Lua数组索引一般从1开始。

表可以嵌套。例如: polyline = {color = "blue", {x=0,y=0},{x=-10,y=0}}。 于是polyline[1] 就是{x=0,y=0}这个表。

大括号内部的逗号可以用分号代替。

运算

5%3 = 2   5.5 % 1 = 0.5

^是乘方,不是异或

~=才是不等于

比较操作可以用于任意类型,字符串比较(包括大于小于)是按照字母顺序的,例如 "2" < "15" 返回false

and or为运算法,and如果第一个操作数为假,返回之,否则返回第二个,or如果第一个为真,返回之,否则返回第二个。注意不是返回布尔型。

赋值

多重赋值 a,b = "va",10,a、b分别得到对应的值。Lua先对右边求值,再赋值。于是a,b = b,a可以用来交换a、b

控制结构

if.....elseif .....else ....end  注意不是else if

while ... do .....end 注意有do

repeat ... until ...

for i = 1,10,2 do ....end  从1开始,每步自增2,直到大于10(注意不是大于等于)。不要在循环过程中改i。

for i,v in ipairs(a) do print (i,v) end 只打印从1开始连续整数索引的元素,i是下标,v是value。同样不要在循环过程中修改变量的值。若是改为pairs,则可以遍历所有元素。

函数

“成员函数”的调用方式: o.foo(o,x) 可写成 o:foo(x)

function add(a) ..... return ... end 函数定义语法

多个返回值,直接return a,b

变长参数 function show(...)  for i,v in ipairs{...} do .... end return end 注意在函数内部也是通过...访问变长参数。例如 a,b = ...。可以把...当做一个表达式看待。

具有变长参数的函数可以拥有任意数量的固定参数,但是要放在变长参数之前。

特别重要的一点是,所有局部变量都要声明为local,否则自动变成全局。