Damian Lau

lua入门

lua是一门动态类型语言。这意味着变量没有类型,只有值才有类型。语言中不设类型定义,所有的值携带自己的类型。在lua中,除了关键字,一切都是变量。

注释

单行注释:连续两个减号‘--

多行注释:由‘--[[’开始,‘]]’结束

关键字

and break do else elseif end false for function if in
local nil not or repeat return then true until while

变量

lua支持的变量类型

Nil 空值,所有没有用过的变量都是nil,nil即是值也是类型
Boolean true或者false
Number 相当于c的double
String 可以包含也可以不包含‘\0'
Table 关系表类型
Function 函数类型
Userdata 专门用来和lua的宿主程序打交道,常用的是struct或指针
Thread 线程类型

在lua中不管在什么地方使用变量,都不需要声明,并且所有的变量默认都是全局变量,除非显示指定local关键字。

String

以下表示的是完全相同的字符串:

a = 'alo\n123"'
a = "alo\n123\""
a = '\97lo\10\04923"'
a = [[alo
123"]]
a = [==[
alo
123"]==]

Table

关系表类型是一个很强大的类型,你可以把它看成是一个数组,不过不同于c数组只能用正整数来作索引,lua中可以用任意类型作为Table的索引,除了nil。另外,不同于c数组内容只允许一种类型,lua中允许任意类型作为Table内容,除了nil。

T["John"] = {Age=27, Gender="Male"} 等价于
T["John"] = {}
T["John"]["Age"] = 27
T["John"]["Gender"] = "Male"

当表的索引是字符串的时候,可以简写为

T.John={}
T.John.Age = 27
T.John.Gender = "Male"

或者

T.John{Age=27, Gender="Male"}

复杂一点的Table:

T = {
    10, --相当于[1] = 10
    [100] = 40,
    John = {
        Age = 27,
        Gender = Male
    },
    20 --相当于[2] = 20
}

Function

定义简单:

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

等价于

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

可以返回多个结果:

function s()
    return 1,2,3,4
end

a,b,c,d = s() --此时,a=1,b=2,c=3,d=4

lua编程

lua语句可以用分号’:‘隔开,也可以用空白隔开

if

if condition then
    ...
elseif condition then
    ...
else
    ...
end

例如

if 1+1~=2 then
    print("true")
elseif 1+2~=3 then
    print("true")
else
    print("false")
end

while

while condition
do
    ...
end

repeat

repeat
    ...
until condition

for

for var=init, end, step
do
    ...
end

for var1, var2, ..., varn in tables
do
    ...
end

例如

for i=1, 10, 2
do
    print(i);
end

for a, b in list
do
    print(a, b)
end

步进step省略时,使用默认值1。break可以用来终止当前循环。

与c的不同

语句块

c中使用’{‘和’}’括起来,在lua中使用doend括起来。

赋值语句

lua中赋值更强大,例如

a,b,c,d=1,2,3,4
a,b=b,a

变量默认都是全局的,局部变量在首次赋值时使用local

数值运算

除了c中的+,-,*,/,lua中还多了一个指数乘方运算”^“,比如2^3=8。

连接两个字符串可以使用”..“,例如,”this is a “ .. “string”连接后是“this is a string”。

比较运算

<, >, <=, >=, ==, ~=这些运算符总返回true或false。

Table,Function,Userdata类型的数据只有==,~=两个比较运算,相等表示两个变量引用的是同一个数据。

逻辑运算

and,or,not

在lua中,只有false和nil才被计算为false,其他任何数据都计算为true,包括0

and和or的运算结果不是true或false,而是和两个操作数相关,比如

a and b: 如果a为false,则返回a;否则返回b
a or b:如果a为true,则返回a;否则返回b

x = x or v:相当于
if not x then x = v end

参考这里