Lua核心编程之基础

由于本人这个学期选了一门选修课《cocos2d-x移动游戏开发》,所以想整理一下笔记了。不保证博客的全面性,我只记一些我认为需要记录的,最好的学习方式还是看书。

学习资料:《cocos2d-x之lua核心编程》、极客学院、老师的ppt

学习环境:mac os x,sublime text,cocos2d-x 3.1,lua 5.3

编译环境的搭建请参考其他博客,感觉搭建环境还是挺费事的。

一、Lua基础语法

1、21个关键字:and  break  do  else  else if  end   false   for   function   if

in   local   nil   not   orrepeat   return   then   true   until    while 

2、lua中的8种基础类型:

nil: 空  (可以用来删除一个元素
boolean: 布尔
number: 数字
string: 字符串
function: 函数
table: 表
userdata: 定义数据类型
thread: 线程

用函数type来检测一个变量的类型。

如类型测试:
print(type(var)) 

var = 20 

print(type(var)) 

var = "Hello world" 

print(type(var))

 var = print 

print(type(var)) 

var = {} 

print(type(var))

3、string类型

[[]]来处理转义定义字符串,括号中间可以加 若干个"="号,如 [==[ ... ]==]

下面的语句所表 的是完全相同的字符串:
a = 'alo\n123"'
a = "alo\n123\""
a = '\97lo\10\04923"' 

a = [[alo
123"]] 

a = [==[
alo
123"]==]

4、需要连接两个字符串用连接操作符".."( 类似C语言中的strcat )

eg: print("hello".."world")

5、"#"获取字符串的长度。

eg:  a = "hello world"

       print(#a)

或string库函数
a = "Hello world" print(string.len(a))    (貌似这个函数最新版本的lua不再支持了)

6、table = 数组+映射

1)数组

①a = {}

a[1]=1

a[2]=5

a[3]="hello"

print(a[1],a[2],a[3])

②a = {1,5,"hello"}

print(a[1],a[2],a[3])

这两种定义方式效果一样。

2)映射

类似于C语言中的map,[]里面的是key值。(数据库的table)

①a= {}

a["hello"]=2

a[3]=false

print(a.hello,a[3])

②a={["hello"]=2,[3]=false}

print(a.hello,a[3])

这两种定义方式效果一样。

7、逻辑运算符:and(与)   or(或)   not(非 )

8、局部变量:

i = 10           -- 全局变量
local j = i      -- 局部变量

9、控制语句

1)if...then...else

lua中的写法:

if a>b then
else if a>c then
else
end

lua中不支持switch语句,条件判断只有if语句。

2)while

lua中的写法:

while a<5 do
    a = a + 1
end

3)repeat...until

Lua中的repeat语句类似于C语言中的do...while语句,先执行一次再判断条件是否满足。

Lua中的写法:

local i = 0
repeat
     i = i + 1
     print(i..", ")
until i>3
--输出为1,2,3,4

4)for循环

①数字for循环

for var  = from,end,step do
     loop-part
end


eg:倒序输出整数10到1。

for i=10,1,-1 do
	print(i)
end

 
 

表示从from到end,每次递增step。step参数如果不设置的话默认为1。

注:for循环的参数为表达式或者函数调用时,只会调用一次

for i=1,f(x) do 
    print(i)
end

②泛型for循环,类似于C++中的迭代器(iterator)

io.lines用于遍历每行; pairs迭代table元素; ipairs用于迭代数组元素; string.gmatch用于迭代字符串中的单词。

days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
for k,v in pairs(days) do 
       print(v)
end

pairs遍历的结果是散列的,随机的。

a = {
	["foo"] = 1,
	[100] = true,

	[1] = 20,
	[2] = 30,
}

for k,v in ipairs(a) do
	print(k,v) 
end

编译结果为:1   20

                      2   30

原因:ipairs只遍历数组,pairs遍历数组+映射。

5)控制语句break与return

break 用于退出当前循环(for, repeat, while)   ——循环外不可使 

return 用来从函数返回结果,当一个函数自然结束,尾部会有 个默认的return。

tip: Lua要求break和return只能出现在block的结尾句

10、函数

函数的目的:封装、抽象 

封装是为了隐藏细节
抽象是为了便于理解和重复使用

1)函数定义方法

function func()
end

func = function()  end  --注意:end不可以另起一行

以上两种函数定义方法效果一样

2)在Lua语言中函数可以当做一个值赋给变量。

add = function(a,b)  --把函数赋给add
	return a+b
end
foo = add   --把函数赋给foo
print(foo(1,5))

Lua的多返回值

function add(a,b)  
	return a+b,a-b
end

print(add(1,5))   -->结果为6   -4

多变量赋值

a,b = 1,2
a,b = b,a
print(a, b)  -->2,1

3)函数的参数

Lua中函数的参数可以有任意多个。
当给函数传递参数时超过了函数定义的形参个数,那么多余的参数会被丢弃。

function sum (a, b) 
    return a + b
end

print(sum(10, 20, 30))    ——结果为30,自动把多余的参数30丢弃

传入的参数形参少,那么缺少的形参的值默认为nil

function sum (a, b) 
   return a + b
end
print(sum(10))           ——结果为0,相当于10+nil=10

 
 

4)可变参数

function add( ... )
	local  s = 0 
	for i,v in ipairs{...} do
		s = s + v 
	end
	return s
end
print(add (1,2,3,4,5))   --运行结果为15

5)闭包函数

闭包函数是指将一个函数写在另一个函数之内,内部函数可以访问外部函数的局部变量。内部函数没有名称,通常也叫匿名函数。

function newCounter() 
    local i = 0
    return function() 
            i=i+1
            return i
        end
end
c1 = newCounter() 
print(c1())    --> 1 
print(c1())    --> 2


Lua进阶请看下一篇!





你可能感兴趣的:(Lua核心编程之基础)