变量

简单的4种变量类型

  1. number
  2. string
  3. boolean
  4. nil

lua中所有的变量申明 都不需要申明变量类型 他会自动的判断类型(类似C# 里面的 var)
lua中的一个变量 可以随便赋值 ——自动识别类型
lua中使用没有声明过的变量 ,默认值是nil

复杂的4种变量类型

  1. function–函数
  2. table–表
  3. userdata–数据结构
  4. thread–协同程序

type函数

作用:得到变量类型,返回值是一个string

--lua中使用没有声明过的变量 
--不会报错 默认值 是nil
print(b)


--number 所有的数值都是number
print("**********number************")
a = 1
print(a)
print(type(a))
a = 1.2
print(a)
print(type(a))
print("**********string************")
a = "12312"
print(a)
print(type(a))
--字符串的声明 使用单引号或者双引号包裹
--lua里 没有char
a = '123'
print(a)
print(type(a))
print("**********boolean************")
a = true
print(a)
a = false
print(a)
print(type(a))

字符串操作

print("**********字符串************")
str = "双引号字符串"
str2 = '单引号字符串'

长度获取–#

--获取字符串的长度
print("**********字符串长度************")
s = "aBcdEfG字符串"
--一个汉字占3个长度
--英文字符 占1个长度
print(#s)

多行打印

  1. 转义字符
  2. [[]]
print("**********字符串多行打印************")
--lua中也是支持转义字符的
print("123\n123")
print("12\n")

s = [[我是
哈哈哈
]]
print(s)

字符串拼接

  1. string.format
print("**********字符串拼接************")
--字符串拼接 通过..
print( "123" .. "456" )
s1 = 111
s2 = 111
print(s1 .. s2)
print(s1 .. s2)

print(string.format("我是hhh,我今年%d岁了", 18))
--%d :与数字拼接
--%a:与任何字符拼接
--%s:与字符配对
--.......

别的类型转字符串-- tostring()

print("**********别的类型转字符串************")
a = true
print(tostring(a))

字符串提供的公共方法


print("**********字符串提供的公共方法************")
str = "abCdefgCd"
--小写转大写的方法,不会改变原字符串
print(string.upper(str))
--大写转小写
print(string.lower(str))
--翻转字符串
print(string.reverse(str))
--字符串索引查找
print(string.find(str, "Cde"))
--结果是3--5,lua里都是从1 开始的,有两个返回值
--截取字符串
print(string.sub(str, 3))
print(string.sub(str, 3, 4))
--字符串重复拼接
print(string.rep(str, 2))
--字符串修改,返回修改后的字符串和修改的次数
print(string.gsub(str, "Cd", "**"))

--字符转 ASCII码,指定位置1,就是‘L’转为ASCII码
a = string.byte("Lua", 1)
print(a) --76
--ASCII码 转字符
print(string.char(a))
--打印出L

运算符

算术运算符-- + - * / % ^

没有自增自减 ++ –
没有复合运算符 += -= /= *= %=
字符串 可以进行 算数运算符操作 会自动转成number

--字符串 可以进行 算数运算符操作 会自动转成number
print("加法运算" .. 1 + 2)
a = 1
b = 2

a = a + b
a = a + 1
print(a + b)
print("123.4" + 1)

print("减法运算" .. 1 - 2)
print("123.4" - 1)

print("乘法运算" .. 1 * 2)
print("123.4" * 2)

print("除法运算" .. 1 / 2)
print("123.4" / 2)

print("取余运算" .. 1 % 2)
print("123.4" % 2)

--^ lua中 该符号 是幂运算
print("幂运算" .. 2 ^ 5)
print("123.4" ^ 2)

条件运算符-- > < >= <= == ~=(不等于 是 ~=)

print("**********条件运算符************")
-- > < >= <= == ~=
print(3>1)
print(3<1)
print(3>=1)
print(3<=1)
print(3==1)
--不等于 是 ~=
print(3~=1)

逻辑运算符-- and or not

print("**********逻辑运算符************")
--&&  ||  !   “短路”
--and  or  not  lua中 也遵循逻辑运算的 “短路” 规则
print( true and false)
print( true and true)
print( false and true)

print( true or false)
print( false or false)

print( not true)

位运算、三目运算符–lua不支持

条件分支语句

if 条件 then … end

print("**********条件分支语句************")
a = 9
--if 条件 then.....end
--单分支
if a > 5 then
	print("123")
end

--双分支
-- if 条件 then.....else.....end
if a < 5 then
	print("123")
else
	print("321")
end

--多分支
-- if 条件 then.....elseif 条件 then....elseif 条件 then....else.....end
if a < 5 then
	print("123")
--lua中 elseif 一定是连这些 否则报错
elseif a == 6 then
	print("6")
elseif a == 7 then
	print("7")
elseif a == 8 then
	print("8")
elseif a == 9 then
	print("9")
else
	print("other")
end


if a >= 3 and a <= 9 then
	print("3到9之间")
end

--lua中没有switch语法  需要自己实现

不支持switch、三目运算符

循环语句

while – while 条件 do … end


print("**********while语句************")
num = 0
--while 条件 do ..... end
while num < 5 do
	print(num)
	num = num + 1
end

repeat … until 条件

print("**********do while语句************")
num = 0
--repeat ..... until 条件 (注意:条件是结束条件)
repeat
	print(num)
	num = num + 1
until num > 5 --满足条件跳出 结束条件

for

  1. for 变量名=起始值,结束值 do … end
  2. for 变量名=起始值,结束值,增值 do … end

print("**********for语句************")

for i =2,5 do --默认递增 i会默认+1
   print(i)
end



for i =1,5,2 do --如果要自定义增量 直接逗号后面写
   print(i)
end

for i =5,1,-1 do --如果要自定义增量 直接逗号后面写
   print(i)
end


函数

print("**********函数************")
--function 函数名()
--end

两种申明方法

  1. 在function后面取名字
  2. 不取名字,用一个变量存储
print("**********无参数无返回值************")
function F1()
	print("F1函数")
end
F1()
--有点类似 C#中的 委托和事件
F2 = function()
	print("F2函数")
end
F2()

函数传参

  1. 个数多了或者少了,不会报错
  2. 多了弃用
  3. 少了补空
print("**********有参数************")
function F3(a)
	print(a)
end
F3(1)
F3("123")
F3(true)
--如果你传入的参数 和函数参数个数不匹配
--不会报错 只会补空nil 或者 丢弃
F3()
F3(1,2,3)

函数返回值

  1. 可以又多个返回值
  2. 外部用多个变量来接取,接少接多不影响,少了丢弃、多了为nil
print("**********有返回值************")
function F4(a)
	return a, "123", true
end

--多返回值时 在前面申明多个变量来接取即可
--如果变量不够 不影响 值接取对应位置的返回值
--如果变量多了 不应 直接赋nil
temp, temp2, temp3, temp4 = F4("1")
print(temp)
print(temp2)
print(temp3)
print(temp4)

函数的类型-- function

print("**********函数的类型************")
--函数类型 就是 function
F5 = function( )
	print("123")
end
print(type(F5))

不支持函数重载

–函数名相同 参数类型不同 或者参数个数不同
–lua中 函数不支持重载
–默认调用最后一个声明的函数

变长参数-- …

  1. 先用表接,再使用
print("**********变长参数************")
function F7( ... )
	--变长参数使用 用一个表存起来 再用
	arg = {...}
	for i=1,#arg do
		print(arg[i])
	end
end
F7(1,"123",true,4,5,6)

函数嵌套–函数里面声明函数

闭包:改变变量的生命周期

print("**********函数嵌套************")
--函数是变量
function F8()
	return function()
		print(123);
	end
end
f9 = F8()
f9()

--闭包 就是在一个函数里返回一个函数,然后返回的函数改变传入参数的生命周期
function F9(x)
	--改变传入参数的生命周期
	return function(y)
		return x + y
	end
end

f10 = F9(10)
print(f10(5))
12-01 13:22