一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Lua基本语法的学习笔记

时间:2016-04-13 编辑:简简单单 来源:一聚教程网


Lua注释

-- 单行注释:使用两个减号表示此行被注释
print("Hello Lua.")
 
--[[
多行注释。此范围内的行均被注视掉。
]]
print("Hello World.")
Lua数据类型

Lua是动态类型语言,变量不需要类型定义。Lua中有8个基本类型,分别是:
1、nil :Lua中的特殊类型,变量没赋值前默认值为nil;给变量赋值为nil可以删除该变量。
2、boolean :布尔类型。可取值true和false
3、number :数字类型
4、string :字符串,Lua中字符串可以包含任何字符且字符串不可修改。
5、table :表。类似其他语言中的数组、字典。
6、function :函数类型。Lua可以调用Lua或者C实现的函数,Lua所有标准库都是C实现的。标准库包括string库、table库、I/O库、OS库、算术库、debug库。
7、userdata :这个类型专门与Lua的宿主打交道。宿主通常是由c语言和c++语言开发的,在这种情况下,userdata可以是宿主的任何类型,常用的是结构体和指针类型
8、thread :线程类型

Lua表达式

a、算术运算符:+(加) -(减) *(乘) /(除) ^(乘方) %(求模)

b、关系运算符: >(大于) <(小于) >=(大于等于) <=(小于等于) ==(等于) ~=(不等于,这个有点不一样!)

c、逻辑运算符:and or not

逻辑运算符认为false和nil是假(false),其他为真,0也是true!!!and 和 or的运算结果不是true和false,而是和它的两个操作数相关。

a and b -- 如果a为false,则返回a,否则返回b
a or b  -- 如果a为true,则返回a,否则返回b
d、连接运算符
.. 两个点表示字符串连接,如果操作数为数字,Lua将数字转换成字符串

print("Hello " .. "Lua")

Lua基本语法

a、变量

变量可以不用声明直接使用,给变量赋值即创建了这个变量。默认情况下Lua的所有变量都是全局变量,如果需要声明局部变量可以在前面加上local,如:

-- 全局变量
a = 1
 
-- 局部变量
local b = 2
 
-- 等价于x = 1;y = 2
x,y = 1,2
 
-- 交换x和y的值
x,y = y,x

b、if语句


if mon == 1 then
    print("Jan")
elseif mon == 2 then
    print("Feb")
else
    print("Other")
end
c、while语句

Lua跟其他常见语言一样,提供了while控制结构,语法上也没有什么特别的。但是没有提供do-while型的控制结构,但是提供了功能相当的repeat。


a=10
while a < 20 do
   print("value of a:", a)
   a = a+1
end
值得一提的是,Lua 并没有像许多其他语言那样提供类似 continue 这样的控制语句用来立即进入下一个循环迭代(如果有的话)。因此,我们 需要仔细地安排循环体里的分支,以避免这样的需求。

d、repeat-until语句
Lua中的repeat控制结构类似于其他语言(如:C++语言)中的do-while,但是控制方式是刚好相反的。简单点说,执行repeat循环体后,直到until的条件为真时才结束,而其他语言(如:C++语言)的do-while则是当条件为假时就结束循环。

a = 10
repeat
   print("value of a:", a)
   a = a + 1
until a > 15

e、for语句

for语句有两种形式:数字for(numeric for)和范型for(generic for)。
e.1、数值for循环

for init,max/min value, increment
do
   statement(s)
end

下面是控制在一个循环的流程:

1、始化步骤首先被执行,并且仅一次。这个步骤可让您声明和初始化任何循环控制变量。
2、接着是max/min,这是最大或最小值,直到该循环继续执行。它在内部创建了一个条件检查的初值和最大值/最小值之间进行比较。
3、for循环体执行后,控制流跳回至递增/递减声明。这个语句可以更新任何循环控制变量。
4、条件现在重新计算评估。如果这为真则循环执行,并重复这个过程(循环体,然后增加一步,然后再条件)。如果条件为假,则循环终止。

示例:


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

e.2、范型for循环

泛型for循环通过一个迭代器(iterator)函数来遍历所有值:


-- print all values of array'a'
for i,v in iparis(a) do print(v) end
 
-- print all keys of table t
for k in paris(t) do print(k) end
f、break和return语句
break语句用来退出当前循环(for、repeat、while)。在循环外部不可使用。return从函数返回结果。
Lua语法要求break和return只能出现在block的结尾一句(也就是,chunk的最后一句,end之前,else前或者until前)。

Lua table

table 在 Lua 里是一种重要的数据结构,它可以说是其他数据结构的基础,通常的数组、记录、线性表、队列、集合等数据结构都可以用 table 来表示,甚至连全局变量(_G)、模块、元表(metatable)等这些重要的 Lua 元素都是 table 的结构。可以说,table 是一个强大而又神奇的东西。table通过两个花括号来构造。如:


days = {"Sunday", "Monday", "Tuesday"}
 
for idx, day in ipairs(days) do
    print(idx, day)
end
可以用任意类型的值来作数组的索引,但这个值不能是 nil
在构造函数中域分隔符逗号(",")可以用分号(";")替代,通常我们使用分号用来分割不同类型的表元素。


{x=10, y=45; "one", "two", "three"}

所有索引值都需要用 "["和"]" 括起来;如果是字符串,还可以去掉引号和中括号; 即如果没有[]括起,则认为是字符串索引


day = {1,2,3,4,5,6,7}
days = {[day] = "table", sun="Sunday", ["mon"] = "Monday", 123}
print(days[day])
print(days["sun"])
print(days.mon)
print(days[1])

如果不写索引,则索引就会被认为是数字,并按顺序自动从 1往后编;


days = {"Sunday", "Monday",}
for i=1, #days do
    print(days[i])
end

用table时,对于字符串,可以通过.的方式访问,也可以通过[]方式访问


days = {sun = "Sunday", mon = "Monday",}
print(days.sun)
print(days["mon"])
Lua函数

函数可以存储在变量中,可以通过参数传递给其他函数,或者作为函数的返回值(类比C/C++中的函数指针),这种特性使Lua具有极大的灵活性。Lua对函数式编程提供了良好的支持,可以支持嵌套函数。
另外,Lua既可以调用Lua编写的函数,还可以调用C语言编写的函数(Lua所有的标准库都是C语言写的)。


function func_name(arguments-list)
    statements-list
end

Lua函数实参和形参与赋值语句类似,多余部分被忽略,缺少部分用nil补足。函数调用时,当只有一个参数并且这个参数是字符串或者表构造时括号是可选的。如,

print "Hello Lua"
f{x = 10, y = 20}

1、Lua函数不支持参数默认值,可以通过or来实现。


function sum(a , b)
    a = a or 1.1
    b = b or 2.2
    return a + b
end
 
print(sum())

2、Lua函数支持多个返回值

function str_replace()
    return "Hello Lua", 1
end
 
a, b = str_replace()
print(a,b)

3、Lua函数可以支持变长参数
Lua函数可以接受可变数目的参数,通过三个点(...)表示函数有可变的参数。


function sum(...)
    for i,v in pairs({...}) do
        print(i, v)
    end
end
 
sum(2,3,4)

通常在遍历变长参数的时候只需要使用{…},然而变长参数可能会包含一些nil;那么就可以用select函数来访问变长参数了:select('#', …)或者 select(n, …)
select('#', …)返回可变参数的长度,select(n,…)用于访问n到select('#',…)的参数

4、Lua函数支持命名参数
Lua的函数参数是和位置相关的,调用时实参会按顺序依次传给形参。有时候用名字指定参数是很有用的,比如rename函数用来给一个文件重命名,有时候我们我们记不清命名前后两个参数的顺序了:


rename{old="temp.lua", new="temp1.lua"}

Lua可以通过将所有的参数放在一个表中,把表作为函数的唯一参数来实现上面这段伪代码的功能。因为Lua语法支持函数调用时实参可以是表的构造。

5、Lua函数支持闭包

tab = {1,2,3,4,5,6,7,8}
 
function iter()
    local index = 0
    return function()
        index = index + 1
        return tab[index]
    end
end
 
for i in iter() do
   print(i)
end

6、Lua函数可以放在变量、表中

 

local sum = function(...)
    local s = 0
    for _, v in pairs({...}) do
        s = s + v
    end
    return s
end
print(sum(1,2,3,5))
 
op = {add = sum}
print(op.add(1,2,3))
同样,函数也可以作为参数传递或者作为返回值返回

热门栏目