Lua编程
三类用户
- 需要一门简单的脚步语言嵌入到应用程序中的开发者
- 想要提高c/c++语言开发者
- 想要提高运行效率的脚步开发者
特点
- 易嵌入,可以方便的与c/c++编写的游戏逻辑互相调用
- 简单,不涉及任何复杂的编程概念,麻雀虽小五脏俱全
- 轻量,库体积很小,只有几百字节
- 易学习,游戏策划也能使用
- 高性能,对比c/c++其带来的性能损失可以忽略不计
Lua语法
命名规范
这个与C语言基本一样。
类型与值
8中基础类型:
- nil—–空
- boolean——布尔
- number—-数字
- string—-字符串
- function—-函数
- table—-表
- userdata—-自定义数据类型
- thread—–线程
code
- --lua
- function show_type(var) print(type(var)) end show_type(var) var = 10 show_type(var) var = "Hello world" show_type(var) var = print show_type(var) var = {} show_type(var)
nil
nil表示一种类型,它只包含一个值nil。任何变量在未赋值前都是nil。当给一个全局变量赋值nil的时候,表示删除该变量。
boolean
boolean有两个值true和false.在lua中只有false和nil表示假,其他情况都为真,数字0也是真。
code
- var = nil
- if var then
- print ("var is true")
- else
- print("var is false")
- end
number
number类型表示实数,不论是浮点数还是整型数都是number类型。
code
- a = 10--整型
- b = 50.2--浮点数
- c = 5e20--科学计数法
string
Lua中字符串表示一个字符序列。里面可以包含任意的字符,包括数字0(c/c++中的字符串终止字符),并且Lua中字符串的长度是没有限制的,即可以是空字符也可以是整本数,Lua对字符串的处理是很快的。
code
- str = "I'm a string."--单行字符串
- long_str = [[ I'm a "long",string. ]]--多行字符串
- print (str)
- print (long_str)
- --".."是字符串连接符
- str = "I'm ".."a".." string"
- print (str)
- str1 = "I'm"
- str2 = " a string"
- print(str1..str2)
- --"#"能得到字符串的长度
- print (#str1)
- print (#str2)
- print (#str)
table
Lua中的table类似C++中的map,但是,比map更简单。
code
- t = {a = "test1",b = "test2"}
表达式
算术运算符
算术运算符有:+(加),-(减),(乘),/(除),^(指数),%(取模),-(负号)*
code
- a = 3
- b = 5
- print (a + b)
- print (a - b)
- print (a * b)
- print (a / b)
- print (a ^ b)
- print (a % b)
- print (-a)
关系运算符
关系运算符:<(小于),>(大于),<=(小于等于),>=(大于等于),~=(不等于),==(等于)
对于table,userdata,function
,Lua中是以他们的引用来做比较,只有当他们指向同一个对象的时候才是相等的。
逻辑运算符
逻辑运算符有:and(与),or(或),not(非)
if not x then x = v end
可以简写为x = x or v
这个上面已经说过了,这里就不多说了。
操作符的优先级
table 构造式
默认的计数从1开始
code
- t = {}--创建一个空的table
- a = {x = 10,y = 20}
- t = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Staturday"}
- t = {
- name="美女",age = 18,"美女背后的男人1","美女背后的男人2",}
- t = {}
- t.name = "美女"
- t.age = 18
- t[1] = "美女背后的男人1"
- t[2] = "美女背后的男人2"
-
- b = {["x"] = 10,["y"] = 20,1,2,3,4}
-
- --删除table中的一个元素
- b[1] = nil
- --删除table
- b = nil
语句
赋值语句
关于赋值,lua里面比较有意思。
code
- a = 10--正常的赋值
- a,b = 10,20--相当于a = 10,b = 20
- a,b = b,a--交换a,b的值,这个好简单
- --函数返回多个值
- function someValue()
- local a,20
- return a,b
- return
局部变量与块
lua中的变量也有局部变量和全局变量之分,默认定义的变量都是全局变量,定义局部变量需要添加local
code
控制语句
条件语句和循环
- --条件判断
- if a > b then
- else if a > c then
- end
- --while循环
- while a < 5 do
- a = a + 1--lua中没有a += 1这种语法
- end
- --repeat..until循环,类似do--while
- local i = 0
- repeat
- i = i + 1
- print(i..",")
- until > 3
- --for循环
- for var = from,end,step do
- end
- for i = 0,10,1 do
- print(i)
- end
- --for泛型
- t = {"Sunday","Staturday"}
- for k,v in pairs(t) do
- print(k,v)
- end
函数
函数定义
函数参数与返回值
Lua中函数的参数可以有任意多个,当给函数传递的参数超过函数定义的形参个数时,多余的参数会被舍弃,如果少,缺少的默认值为nil.
Lua中函数返回多个参数是,所赋值的表达式不是最后的一个元素,那么函数只返回一个值用来赋值给变量.
code
- function foo()
- return 30,50
- end
- x,y = foo(),20 --x = 30,y = 20
_return返回一个函数的返回值,需要注意的死return f()
这样的语句会把f()返回的所有值都返回,return (f())只能返回一个结果。
unpack:接受一个数组作为参数,并从下标1开始返回该数组的所有元素。
- print(unpack{10,20,30})
- a,b = unpack{10,30}--a = 10,b = 20,30被舍弃
- a = {"hello","ll"}
- string.find(a)
可变参数
code
- function add(...)
- local s = 0
- for i,v in ipairs{...} do
- s = s + v
- end
- return s
- end
闭包函数
code
- function newCounter()
- local i = 0
- reutn function()
- i = i + 1
- return i
- end
- end
- c1 = newCounter()--1
- c2 = newCounter()--2