目录
- 一.HelloWorld与注释
- 1.1运行
- 1.2注释
- 二.变量与基本数据类型
- 2.1变量
- 2.2基本数据类型
- 三.运算符
- 3.1特殊符号
- 3.2算术运算符
- 3.3关系运算符
- 3.4逻辑运算符
- 四.分支结构
- 4.1三种 if 语句
- 五.循环结构
- 5.1for语句
- 5.2while语句
- 5.3repeat-until(do-while)语句
- 5.4关键字(break 和 continue)
- 六.数组
- 6.1数组定义
- 6.2数组遍历
- 七.函数
- 7.1函数定义与调用
- 7.2多重返回值
- 7.3变长参数
- 7.4函数作为参数传递
- 7.5局部函数
- 7.6递归
- 7.7闭包
一、HelloWorld与注释
1.1运行
print("Hello World")
上面语句输出了"Hello World"
Lua是类C的,所以,他对大小写字符敏感
区别于C#,上面的函数无明确所属类,为一个独立的方法
不需要结尾符号(写上分号也不算错,这是可选的)
你可以像python一样,在命令行上运行Lua命令后进入Lua的Shell中执行语句:
也可以把脚本存成一个文件,用如下命令行来运行:
1.2注释
- 单行注释: --
- 多行注释: --[[ ]], --[[ ]]--, --[[ --]]
二、变量与基本数据类型
2.1变量
x = 233 --申明一个变量
print(x) --使用变量
Lua为弱类型语言,声明变量时不需要指定数据类型,变量类型由变量内存储的数据决定
不能使用未赋值变量
变量命名规则:建议使用“驼峰命名法”,即首字母小写,之后的每个单词的开头大写,如:myFirstName
2.2基本数据类型
- number:数值类型,可以存储整数和小数,并且可以使用0x作为开头的16进制数。
- boolean:布尔类型,只有 true 和 false 两个值
- string:字符串类型,双引号,单引号都可以,且支持C类型的转义
- Lua中无 char 类型
--[[
响铃: '\a' 退格: '\b' 表单: '\f' 换行: '\n' 回车: '\r'
反斜杠: '\\' 双引号:'\"' 单引号: '\''
横向制表: '\t' 纵向制表: '\v'
--]]
num1 = 123
num2 = 123.456789
num3 = 0xff
bool = true
boo2 = false
str1 = "双引号"
str2 = '单引号'
--type()方法,可以获取一个变量的类型
print(type(num1))
print(type(num2))
print(type(num3))
print(type(bool1))
print(type(bool2))
print(type(str1))
print(type(str2))
输出
C语言中的null在Lua中是nil,比如你访问一个没有声明过的变量,就是nil
另外,布尔类型只有 nil 和 false 是 false,数字0啊,空字符串 "" 和 '\0′ 都是 true
print(value)
if(nil) then print("1") end
if(false) then print("2") end
if(0) then print("3") end
if("") then print("4") end
if("\0") then print("5") end
输出
三、运算符
3.1特殊符号
- "=" : 仅为赋值符
- "+" : 仅为数学意义上的相加
- ".." : 字符串相连
- 无自加 "++" 和自减 "--"
3.2算术运算符
print("-----算术运算符-----")
print(10+2) --加
print(10-2) --减
print(10*2) --乘
print(10/2) --除
print(10%2) --取余
Lua中无复合赋值运算符(+= -= *= /= %=)
3.3关系运算符
print("-----关系运算符-----")
print(1 > 2)
print(1 < 2)
print(1 >= 2)
print(1 <= 2)
print(123 == 123)
print(123 ~= 123) --不等于:~=
3.4逻辑运算符
print("-----逻辑运算符-----")
print(1<2 and 3>2) --与:and
print(1<2 or 3>2) --或:or
print(not true) --非:not
四、分支结构
4.1三种 if 语句
- if(布尔表达式) then
- --[[代码体]]--
- end
- if(布尔表达式) then
- --[[代码体]]--
- else
- --[[代码体]]--
- end
- if(布尔表达式) then
- --[[代码体]]--
- else if(布尔表达式) then
- --[[代码体]]--
- else
- --[[代码体]]--
- end
五、循环结构
5.1for语句
- for --[[初始表达式]]-- , --[[条件表达式]]-- , --[[增量表达式]]-- do
- --[[代码体]]--
- end
print("-----for循环语句-----")
for i=1,10,1 do
print(i)
end
5.2while语句
- while(条件表达式)
- do
- --[[代码体]]--
- end
print("-----while循环语句-----")
num1 = 0
num2 = 10
while (num1>num2)
do
print(num1)
num1 = num1 + 1
end
5.3repeat-until(do-while)语句
- repeat
- --[[代码体]]--
- until(条件表达式)
print("-----repeat循环语句-----")
num1 = 1
num2 = 10
repeat
print(num1)
num1 = num1 + 1
until(num1>num2)
Lua中无do-while语句,但有类似的repeat-until语句,与do-while不同的是,当until后面的布尔表达式不成立的时候,循环才会执行
5.4关键字(break 和 continue)
- break : 跳出当前循环
- continue : Lua中无此关键字
六、数组
6.1数组定义
- 数组名 = {数据1,数据2,数据3,数组N}
Lua版本的数组可以存放多种不同类型的数据
6.2数组遍历
print("-----数组-----")
array = {10 ,3.14 ,"str" ,true}
for i=1,table.getn(array),1 do
print(array[i])
end
array[5] = false
使用for循环遍历数组,数组的下标是从1开始
取数组长度用到的方法:table.getn(数组名)
Lua中数组的长度是不固定的,申明完毕数组后,我们依然可以往后续的下标位置添加值
七、函数
7.1函数定义与调用
- [局部/全局] function 函数名 ([参数列表])
- --函数体
- end
print("-----函数定义-----")
function Hello()
print("Hello World")
end
function Add(a,b)
return a+b
end
print("-----函数调用-----")
Hello()
sum = Add(5,10)
print(sum)
Lua语言中,在脚本编写顺序上,必须先定义函数,然后在下方才可调用
7.2多重返回值
Lua允许函数返回多个结果,只需要在return关键字后列出所有的返回值即可
print("-----多重返回值-----")
function func()
return "a", "b", "c" --返回三个结果
end
x,y = func() --这里只接收了两个参数,第三个参数被舍弃
print(x,y)
7.3变长参数
Lua会自动调整实参的数量,以匹配参数表的要求,若实参多了则舍弃多余实参;若实参不足则多余的形参初始化为nil
print("-----变长参数-----")
function func(a,b,c,d)
print(a,b,c,d)
end
func(1,2,3) --输出:1,2,3,nil
func(1,2,3,4,5) --输出:1,2,3,4
在C语言中,函数可以接受不同数量的实参,Lua中的函数也可以接受不同数量的实参,代码如下:
print("-----变长参数-----")
function VarArguments(...) -- 打印所有的参数
for i, v in ipairs{...} do
print(v)
end
end
VarArguments(1, 2, 3)
7.4函数作为参数传递
Lua语言中没有委托概念,函数是可以直接当成参数来传递的,即函数与其它传统类型的值具有相同的权利,函数可以存储到变量或table中,也可以作为实参传递给其它函数,还可以作为其它函数的返回值。
print("-----函数作为参数传递----")
function Add(a,b)
return a+b
end
function AddDelegate(a,b,func)
return func(a,b)
end
num = AddDelegate(1,2,Add)
print(num)
在Lua中有一个容易混淆的概念是,函数与所有其它值一样都是匿名的,即它们都没有名称。当讨论一个函数名时,实际上是在讨论一个持有某函数的变量,例如以下代码:
-- 我们经常这样定义函数
function foo(x) return 2 * x end
-- 实际上,这只是一种“语法糖”而已;
-- 上述代码只是下面代码的一种简化书写形式
foo = function (x) return 2 * x end
7.5局部函数
函数前面加上local就是局部函数,没有加local关键字的函数在Lua中默认都是全局函数
7.6递归
function fib(n)
if n < 2 then return 1 end
return fib(n - 2) + fib(n - 1)
end
print(fib(5))
7.7闭包
由于词法域的原因,当一个函数写在另一个函数内部,而这个内部函数可以访问外部函数的局部变量,这个被访问的局部变量既不是全局的也不是局部的,被称为非局部的变量(non-local variable)
所以闭合函数就是这个内部函数加上该函数需要访问的所有的非局部变量的函数。
示例一
function newCounter()
local i = 0
return function() -- anonymous function
i = i + 1
return i
end
end
c1 = newCounter()
print(c1()) --输出 1
print(c1()) --输出 2
示例二
function myPower(x)
return function(y) return y^x end
end
power2 = myPower(2)
power3 = myPower(3)
print(power2(4)) --输出4的2次方
print(power3(5)) --输出5的3次方