- 下载安装IDE(http://static.runoob.com/download/LuaForWindows_v5.1.4-46.exe)
- 第一个Lua程序: HelloWorld.lua
- 打开LuaIDE(SciTE),在编辑框中输入print("hello world") 并保存,注单,这里必须保存为*.lua的格式。
- 按F5就可以编译支行*.lua的文件了,在控制台可以查看输出内容
- 打开LuaIDE(SciTE),在编辑框中输入print("hello world") 并保存,注单,这里必须保存为*.lua的格式。
- 基础语法
- 单行注释: --
- 多行注释:--[[多行注释]]
或 --[=[多行注释]=]
- 变量命名:字母、数字、下划线组成,并不能以数字开头
- 数据类型:
- nil:取值nil,表示一个无效的值类似于null,在条件表达式中为false
- boolean:取值false,true
- number:数字类型,双精度类型的实浮点数
- string:字符串,""
或 '' 或 [[字符串块]]
- function:函数,由C或Lua编写的函数,函数可以保存到指定变量里
- table:数组或列表,tab={} 创建了一个空表,下标从1开始,若指定的键的值,则没下标了
- thread:线程?
- userdata:数据结构?
- nil:取值nil,表示一个无效的值类似于null,在条件表达式中为false
- 变量:
- 变量分类
a = 5 --全局变量(默认就是全局变量) local b = 10 --局部变量(用local修饰则是局部变量) function test() c = 15 --全局变量(没有local修饰,不论在哪定义都是全局变量) local d = 20 --局部变量(仅在test函数体里有效) local a = 50 --局部变量(在test函数体里a是50,出了test函数体a还是5) b = 100 --全局变量(在test函数体里、外b都等于100) end print(a,b,c,d) -->5,10,nil,nil(没调用test函数前,test体内的操作不生效) test() print(a,b,c,d) -->5,100,15,nil
- 可以多变量一起赋值:
a,b,c = 0,1 --当变量个数和值个数不一至时,多的变量赋nil,多的值会被忽略 print(a,b,c) -->0,1,nil a,b,c =10 print(a,b,c) -->10,nil,nil (b由1改成了nil)
- 多变量赋值一般用来交换变量以及接收函数返回的多值:
a,b = b,a --交换变量(先执行 等号 的右边,再赋值给左边) a,b = f() --f()第一个返回值给a,第二个返回值给b
- 函数体内尽可能用局部变量,有两个好处:1.避免命名冲突,2访问局部变量的速度比访问全局变量快
- 变量分类
- 循环: while for repeat...until
- while循环: while (condition) do ... end
a = 10 while( a < 20 ) do print("a 的值为:", a) a = a+1 end
- for循环:
- 数值for循环
exp1 = 1 exp2 = 10 exp3 = 2 --步长,可以不指定,默认为1 --for的三个表达式在循环开始前一次性求值,以后不再进行求? --即:若exp1,exp2,exp3是函数,则只在循环开时前执行一次 for i = exp1,exp2,exp3 do --i从exp1变化到exp2,每次变化以exp3为步长递增i print(i) end
- 泛型for循环
tab = {"aaaa","bbbb", key1 = "cccc",key2 = "dddd",nil, "eeee"} for k,v in pairs(tab) do --pairs:遍历tab中所有元素,遇到nil会自动忽略 print(k .. ":" .. v) end for k,v in ipairs(tab) do --ipairs:仅遍历下标是数字的元素,且遇到nil就会终止循环 print(k .. "=" .. v) end
- 数值for循环
- repeat....until循环:
a = 10 repeat --循环开始先执行一次,再判断条件是否成立 print(a) a=a-1 until(a < 5) --满足条件则终止循环
- 循环控制语句: break (lua只有 break:跳出循环)
tab = {"aaa","bbb","ccc","ddd","eee"} for k,v in pairs(tab) do if(k > 3) then break end print(k .. ":" .. v) end
- while循环: while (condition) do ... end
- 流程控制: if (condition) then ... end if (condition) then ... else ... end if(condition) then ... elseif(condition) then ... else ... end
a,b = 10,20 if( a<b ) then print("a < b") end if( a<b ) then print("min is a") else print("min is b") end if( a<5 ) then print("不及格") elseif( a>=5 and a<8 ) then print("良好") else print("优秀") end
- 函数 function(arg1,...argn) functionBody end 在function前还可以用local修饰,来标记函数为局部函数
--[[ 比较两个数的大小,并返回较大的数]] function maxFun(num1,num2) local res = 0 if(num1>num2) then res = num1 else res = num2 end return res end print("两值中最大值为:" .. maxFun(100,20)) print("两值中最大值为:" .. maxFun(10,10.5)) --[[将函数作为参数传递给函数]] function printFun(str) print("这是打印函数 : " .. str) end function addFun(num1,num2,fun) local res = num1 + num2 fun(res) end addFun(12,30,printFun) --[[多返回值函数:返回一个数组中最小的值及该值的下标]] tab1 = {10,2,45,0.4,8,0.03,200} function minFun(tab) local i = 1 --最小值的下标 local min = tab[i] --最小值 for k,v in ipairs(tab) do if( v<min ) then i = k min = v end end return i,min end print(minFun(tab1)) --[[可变参数的函数:求传入参数的下平均值]] function avgFun(...) local res =0 local arg ={...} for k,v in ipairs(arg) do res = res + v end print("总共有 " .. #arg .. "个参数") return res / #arg end print("平均值为:" .. avgFun(1,2,34,56,7))
- 运算符:算术运算符、关系运算符、逻辑运算符、其他运算符
- 算术运算符:+ (加法)、-(减法) 、*(乘法) 、/(除法) 、%(取余)、^(乘幂)
- 关系运算符:==(等于)、~=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等行)
- 逻辑运算符:and(逻辑与)、or(逻辑或)、not(逻辑非)
- 其他运算符:..(连接两个字符串,在lua里面+不能用作字符连接)、#(一元运算符,返回字符串或数组长度)
str = "aabbccd" tab = {k3="aa" , "bb" , nil , "cc" , k1="dd" , k2="ee"} print(#str) --7 print(#tab) --3,针对表,#只计算下标为数字的元素个数 print("hello" .. " " .. "world") --hello world print("hello" + " " + "world") --报错
- 运算符优先级:
--[[ 从高到低的顺序: ^ not - (unary) * / + - .. < > <= >= ~= == and or ]] --[[ 除了^和..外所有的二元运算符都是左连接的。 a+i < b/2+1 <--> (a+i) < ((b/2)+1) 5+x^2*8 <--> 5+((x^2)*8) a < y and y <= z <--> (a < y) and (y <= z) -x^2 <--> -(x^2) x^y^z <--> x^(y^z) ]]
- 单行注释: --
lua 学习总结
最新推荐文章于 2019-07-15 17:27:45 发布