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
View Code

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

根据操作数的真假相应的返回falsetrue

and

a and b a 为真返回b,否者返回a

or

a or ba是假则返回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
View Code

作用域

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
View Code

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
View Code
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
View Code

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
View Code

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
View Code

对于映射的删除需用赋值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
View Code

数组长度和字符串长度

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
原文地址:https://www.cnblogs.com/HKUI/p/6756222.html