lua语法基本
lua的下载
http://luabinaries.sourceforge.net/
点击所要下载的版本
比如我下的是5.3.3
https://sourceforge.net/projects/luabinaries/files/5.3.3/
下载windows下二进制文件
lua-5.3.3_Win32_bin.zip
解压完后
在同目录下建立test.lua
print("hello lua"); for i=1,10,2 do print(i) end
执行
E:\lua>lua53 test.lua hello lua 1 3 5 7 9
for i=起始值,结束值,步长
步长可以省略 默认是1
lua的值和类型
字符串和布尔
test.lua
a="abc" b=false c=true d='ds' e=3.1415926 print(a,b,c,d,e);
E:\lua>lua53 test.lua
abc false true ds 3.1415926
lua的比较操作符
操作符 |
说明 |
== |
比较两个操作数的类型和值是否都相等 |
~= |
与==结果相反 |
<,>,<=,>= |
--数字操作符的操作数如果是字符串会自动转换成数字 a=1+1 b=1+'1' --c=1+'c' 出错 print(a,type(a),b,type(b),a==b) --2 number 2.0 number true --比较操作符不同于数学操作符,不会对操作数的类型自动转换 print(1=='1') --false print({'a'}=={'a'}) --false print(tonumber('F',16)) --15
lua中的table
table=数组+映射
lua中单行注释 --
块注释
--[[
]]
数组
数组的下标识从1开始的而不是0
数组的下标必须连续,否者就是映射了
a={10,20,"lua"} --[[ 或者 a={} a[1]=10 a[2]=20 a[3]="lua" ]] print(a[1],a[2],a[3]);
E:\lua>lua53 test.lua
10 20 lua
映射
a={ ["key1"]=10, [2]=false } --[[ 或者 a={} a['key1']=10 a[2]=false ]] print(a.key1,a[2]);
lua函数
函数的调用必须在声明的后面(代码的位置顺序)
test.lua
function add(a,b) return a+b end add1=function ( a,b) return a+b end print(add(1,2)) print(add1(1,2))
E:\lua>lua53 test.lua
3
3
函数的多返回值
function add(a,b) return a+b,a-b,a*b end r=add(2,5); print(add(2,5)) print(r,type(r));
E:\lua>lua53 test.lua
7 -3 10
7 number
可以在Lua中创建一个具有可变参数的函数...作为它的参数
function average(...) result = 0 local arg={...} for i,v in ipairs(arg) do result = result + v end return result/#arg end print("The average is",average(1,2,3,4,5,6))
E:\lua>lua53 test.lua
The average is 3.5
多变量的赋值和值的交换
a,b=1,2 print(a,b) a,b=b,a print(a,b) c,d=1 print(c,d) e,f=1,2,3 print(e,f) g,h=1, print(g,h)
E:\lua>lua53 test.lua 1 2 2 1 1 nil 1 2 nil nil
多重赋值时,lua会先计算所有表达式的值
local a= {1,2,3} local i=1 i,a[i]=i+1,5 print(i) --2 for k1,v1 in ipairs(a) do print(k1,v1) end --[[ 2 1 5 2 2 3 3 ]]
lua计算完所有表达式的值后,上面最后一个赋值语句成为
i,a[1]=2,5
lua的表达式逻辑操作符
只要操作数不是nil或者false,逻辑操作符就认为操作数为真
操作符 |
说明 |
not |
根据操作数的真假相应的返回false和true |
and |
a and b 中a 为真返回b,否者返回a |
or |
a or b中a是假则返回a ,否者返回b |
print(1 and 5) --5 print(1 or 5) --1 print(not 0) --false print(not 1) --false print('' or 1); --''
print(true and false) print(true and true) print(true or false) print(not true) print(not false) --字符串拼接 print("hello".." world");
E:\lua>lua53 test.lua false true true false true hello world
作用域
function fun() a=1 local b=2 end fun() print(a,b)
E:\lua>lua53 test.lua 1 nil
local x = 10 if true then local x=x+1 print(x) do local x=x+1 print(x) end print(x) end print(x) --[[ 执行结果 11 12 11 10 ]]
lua的流程控制
if elseif
a=1 if(a>1) then print("a>1") elseif(a<1) then print("a<1") else if(a==1) then print("a=1") else print("a is not num") end end
a必须是数字,否者不能参与比较
elseif不可以写成else if lua里没i++
while
local i=0 while i<10 do print(i) i=i+1 end
repeat
statement(s)
until( condition )
i=1 repeat print(i); i=i+1 until(i>5)
for循环
for i=起始值,终点值,步长
步长可以省略 默认是1
for i=1,10 do print("i="..i) end for j=1,10,2 do print("j="..j) end
E:\lua>lua53 test.lua i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9 i=10 j=1 j=3 j=5 j=7 j=9
for的泛型遍历
迭代器
pairs() 遍历table里的所有元素
ipairs() 只遍历数组(必须1开始的键 而且必须连续)
迭代器 http://www.cnblogs.com/HKUI/articles/6757372.html
a={ ['a']='ajax', [100]=true, [1]=1, [2]=3 } for k,v in pairs(a) do print(k,v) end print("----------------------") for k1,v1 in ipairs(a) do print(k1,v1) end
2次运行,对于pairs顺序完全是没有保障的 E:\lua>lua53 test.lua 100 true 1 1 2 3 a ajax ---------------------- 1 1 2 3 E:\lua>lua53 test.lua 100 true a ajax 2 3 1 1 ---------------------- 1 1 2 3
a={ ['a']='ajax', [99]=999, [100]=true, [2]=3 } for k,v in pairs(a) do print(k,v) end print("----------------------") for k1,v1 in ipairs(a) do print(k1,v1) end
E:\lua>lua53 test.lua a ajax 100 true 2 3 99 999
二维或多维数组
arr={ {'a','b','c'}, {'aa','bb','cc'}, {['a']='ajax'} } for k,v in pairs(arr) do for k1,v1 in pairs(v) do print(k..'-'..k1,v1) end end
E:\lua>lua53 test.lua 1-1 a 1-2 b 1-3 c 2-1 aa 2-2 bb 2-3 cc 3-a ajax
lua里的包
同目录下有 foo.lua,test.lua
foo.lua
local class={} function class.foo( a,b ) return a+b end return class
test.lua
local c=require("foo") print(c); print(c.foo(1,2)) for i=1,2 do print(require("foo")) end print("-------------") for i=1,2 do print(dofile("foo.lua")) end
E:\lua>lua53 test.lua table: 00038798 3 table: 00038798 table: 00038798 ------------- table: 0003bcf8 table: 0003bcd0
require与dofile
require运行多次 ,对于同一个table 只加载一次
dofile运行多次,对于同一个table,每次都是重新加载
lua的系统库
local t={} for i=1,5 do table.insert(t,i..'_'..i) end for k,v in pairs(t) do print(k..'='..v) end print("----------"); table.remove(t,2) for k,v in pairs(t) do print(k..'='..v) end for k,v in pairs(table) do print(k,v) end
运行
E:\lua>lua53 test.lua 1=1_1 2=2_2 3=3_3 4=4_4 5=5_5 ---------- 1=1_1 2=3_3 3=4_4 4=5_5 sort function: 62995870 move function: 62995940 insert function: 62995e00 remove function: 62995c40 pack function: 62995160 concat function: 62995fa0 unpack function: 62994fc0
对于映射的删除需用赋值nil
local t={} t.a="ajax" t.b="bbc" for k,v in pairs(t) do print(k,v) end table.remove(t,a) print("------------"); for k,v in pairs(t) do print(k,v) end print("---------") t.a=nil for k,v in pairs(t) do print(k,v) end
执行
E:\lua>lua53 test.lua a ajax b bbc ------------ a ajax b bbc --------- b bbc
数组长度和字符串长度
local t={ ['a']="ajax", ['b']="bbc", [1]=11, [2]=222 } print("t len= "..#t); local t1={1,2,3,4} print("t1 len= "..#t1) local str="php7" print("str len= "..#str)
E:\lua>lua53 test.lua t len= 2 t1 len= 4 str len= 4
tonumber,tostring
string.format() 类似c中printf
a="3.14" print(a,type(a)); a=tonumber(a) print(a,type(a)); b=3.1415 print(b,type(b)) b=tostring(b) print(b,type(b)) person="tom" print(string.format("hello %s",person))
E:\lua>lua53 test.lua 3.14 string 3.14 number 3.1415 number 3.1415 string hello tom
lua字符串操作
1.单引号之间的字符
2.双引号之间的字符
3.[[]]
test.lua str1='php' str2="javascript" str3=[[php7]] str4="php \" best\" " str5='php "best"' str6=[[php "best"]] print("str1="..str1) print("str2="..str2) print("str3="..str3) print("str4="..str4) print("str5="..str5) print("str6="..str6) E:\lua>lua53 test.lua str1=php str2=javascript str3=php7 str4=php " best" str5=php "best" str6=php "best"
字符串操作方法
for k,v in pairs(string) do print(k) end E:\lua>lua53 test.lua gsub gmatch match len byte char lower sub format upper dump rep find unpack packsize pack reverse
test.lua s="php5 pHp7" lower_s=string.lower(s) upper_s=string.upper(s) gsub=string.gsub(s,'php','python') reverse=string.reverse(s) rep=string.rep('p',3) print("lower_s="..lower_s) print("upper_s="..upper_s) print("gsub="..gsub) print("reverse="..reverse) print("rep="..rep) E:\lua>lua53 test.lua lower_s=php5 php7 upper_s=PHP5 PHP7 gsub=python5 pHp7 reverse=7pHp 5php rep=ppp