安装请看我的另一篇博客:https://blog.csdn.net/qq_42094345/article/details/107816577
hello world
print:打印函数
新建一个文件helloWorld.lua(lua源代码以lua为后缀),并写入内容
print("Hello World !")
保存并进入源文件目录下使用 lua
命令执行:
lua .\helloWorld.lua
结果:
基本语法
- lua交互页面
交互页面:来自百度百科的介绍
使用命令lua
或者 lua -i
进入交互页面
-
lua保留字(重要)
保留关键字不能作为常量或变量或其他用户自定义标示符
一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。 -
标识符
Lua 标示符用于定义一个变量,函数获取其他用户定义的项。标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。
最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。
Lua 不允许使用特殊字符如 @, $, 和 % 来定义标示符。
Lua 是一个区分大小写的编程语言,因此在 Lua 中 Runoob 与 runoob 是两个不同的标示符。
以下列出了一些正确的标示符:
mohd zara abc move_name a_123
myname50 _temp j a23b9 retVal
- 变量
在默认情况下,变量总是认为是全局的。
全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。
如果你想删除一个全局变量,只需要将变量赋值为nil。
这样变量a就好像从没被使用过一样。换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。
局部变量(local variable)
只在被声明的哪个代码块内有效
代码块:控制结构、函数、chunk(变量被声明的那个文件或者文本串)
定义方法:使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。定义局部变量可以为它设置一个初始值,也可以不用
local a = 123
local b
全局变量(global variable)
全局变量Lua变量默认是全局的,在整个会话中将保持不变,除非改变了它。在使用全局变量时,在变量前加个g字母会更加明确。不过,尽量使用局部变量。
定义方法:在Lua中定义全局变量非常简单,就是定义变量的时候,前面不要加上local
c = 123
注意:全局变量必须有初始值!
Lua 数据类型及使用
Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。
我们可以使用 type 函数测试给定变量或者值的类型
print(type(a))
结果:nil
a = 1
print(type(a))
结果:number
- nil(空)
nil 类型表示一种没有任何有效值,它只有一个值 – nil,例如打印一个没有赋值的变量,便会输出一个 nil 值
交互页面:
> print(a)
nil
对于全局变量和 table,nil 还有一个"删除"作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉:
新建lua文件 test.lua
然后写入以下代码:
t = { k1 = "val1", k2 = "val2", k3 = "val3" }
print("-------------------------第一次打印-------------------------------")
-- 遍历这个table 并打印
for k, v in pairs(t) do
print(k .. " - " .. v)
end
print("-------------------------第二次打印-------------------------------")
-- 将变量t删除
t.k1 = nil
-- 重新遍历并打印
for k, v in pairs(t) do
print(k .. " - " .. v)
end
使用lua
命令执行脚本 lua .\test.lua
结果:
PS E:\Domes\lua\test1> lua .\test.lua
-------------------------第一次打印-------------------------------
k1 - val1
k3 - val3
k2 - val2
-------------------------第二次打印-------------------------------
k3 - val3
k2 - val2
PS E:\Domes\lua\test1>
清楚的发现 k1已经被我们删除
注意: 这里打印中文可能会出现乱码问题,解决方法有两种,1:让你的系统平台编码改为utf-8
或者 文件格式改为 GBK。具体自行百度吧,很简单。如果你linux、mac应该不会出现类似问题。
- boolean(布尔)
boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是 false,其他的都为 true,数字 0 也是 true:
> print(type(true))
boolean
>print(type(false))
boolean
> print(type(nil))
nil
>
> -- 判断两个变量是否相等
> a = 1
> b = 2
> c = 1
> print(a == b)
false
> print(a == c)
true
>
布尔主要用于分支的判断:
a = 1
b = 2
c = 1
if a == b then
print("a等于b")
else
print("a不等于b")
end
if a == c then
print("a等于c")
else
print("a不等于c")
end
结果:
PS E:\Domes\lua\test1> lua .\test.lua
a不等于b
a等于c
PS E:\Domes\lua\test1>
- number(数字)
Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义),以下几种写法都被看作是 number 类型:
print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))
结果:
PS E:\Domes\lua\test1> lua .\test2.lua
number
number
number
number
number
number
PS E:\Domes\lua\test1>
- string(字符串)
字符串由一对双引号或单引号来表示。
a = "abc"
b = 'edf'
print(a)
print(b)
结果:
PS E:\Domes\lua\test1> lua .\test3.lua
abc
edf
PS E:\Domes\lua\test1>
也可以用 2 个方括号 “[[]]” 来表示"一块"字符串。
html = [[
<html>
<head></head>
<body>
<a href="http://www.baidu.com/">baidu</a>
</body>
</html>
]]
print(html)
结果:
<html>
<head></head>
<body>
<a href="http://www.baidu.com/">baidu</a>
</body>
</html>
在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字:
PS E:\Domes\lua\test1> lua
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio
> print("2"+1)
3
> print("2"+"2")
4
> print("2"*"3")
6
> print("2"*5)
10
>
但是
PS E:\Domes\lua\test1> lua
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio
> print("a"+1)
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
stdin:1: in main chunk
[C]: ?
>
如果字符串中不是数字但是却与数字相加是不允许的,所以会报错。
我们可以使用..
对他们进行字符串拼接:
PS E:\Domes\lua\test1> lua
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio
> print("a".."b")
ab
> print("abc".."def")
abcdef
> print(123 .. 456)
123456
>
注意: 数字拼接时注意加空格!
使用 # 来计算字符串的长度,放在字符串前面,如下实例:
PS E:\Domes\lua\test1> lua
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio
> print(#"abc")
3
>
4.table(表)
在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表
-- 创建一个空的 table
local t1 = {}
-- 直接初始表
local t2a = {"apple", "pear", "orange", "grape"}
Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。
a = {}
a["k1"] = "abc"
kk = "k2"
a[kk] = 22
a[kk] = a[kk] + 11
for k, v in pairs(a) do
print(k .. " : " .. v)
end
结果
PS E:\Domes\lua\test1> lua .\test4.lua
k1 : abc
k2 : 33
PS E:\Domes\lua\test1>
不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
print("Key", key)
end
结果:
S E:\Domes\lua\test1> lua .\test4.lua
Key 1
Key 2
Key 3
Key 4
PS E:\Domes\lua\test1>
table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。
a = {}
for i = 1, 10 do
a[i] = i
end
a["k1"] = "123"
print(a["k1"])
print(a["none"])
结果:
PS E:\Domes\lua\test1> lua .\test4.lua
123
nil
PS E:\Domes\lua\test1>
- function(函数)
在 Lua 中,函数是被看作是"第一类值(First-Class Value)",函数可以存在变量里
function test( a )
return "参数为:"..a
end
print(test(1111))
myfun = test
print(myfun(2222))
结果:
PS E:\Domes\lua\test1> lua .\test4.lua
参数为:1111
参数为:2222
PS E:\Domes\lua\test1>
function 可以以匿名函数(anonymous function)的方式通过参数传递
function testFun(tab,fun)
for k ,v in pairs(tab) do
print(fun(k,v));
end
end
t={k1="a",k2="b"};
testFun(t, function(key,val) --匿名函数
return key.."="..val;
end
);
结果:
PS E:\Domes\lua\test1> lua .\test4.lua
k1=a
k2=b
PS E:\Domes\lua\test1>
-
thread(线程)
在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。 -
userdata(自定义类型)
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。 -
Lua 变量
变量在使用前,需要在代码中进行声明,即创建该变量。
编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。
Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束。
变量的默认值均为 nil。
a = 5 -- 全局变量
local b = 5 -- 局部变量
function joke()
c = 5 -- 全局变量
local d = 6 -- 局部变量
end
joke()
print(c,d) --> 5 nil
do
local a = 6 -- 局部变量
b = 6 -- 对局部变量重新赋值
print(a,b); --> 6 6
end
print(a,b) --> 5 6
- 赋值语句
a = "hello" .. "world"
t.n = t.n + 1
结果:
PS E:\Domes\lua\test1> lua
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio
> a = "hello" .. "world"
> print(a)
helloworld
> t = {}
> t.n = 1
> print(t.n)
1
> t.n = t.n + 1
> print(t.n)
2
>
(1)Lua 可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。
a, b = 10, 2*x <--> a=10; b=2*x
(2)遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:
x, y = y, x -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'
(3)当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
a. 变量个数 > 值的个数 按变量个数补足nil
b. 变量个数 < 值的个数 多余的值会被忽略
例子:
a, b, c = 0, 1
print(a,b,c) --> 0 1 nil
a, b = a+1, b+1, b+2 -- value of b+2 is ignored
print(a,b) --> 1 2
a, b, c = 0
print(a,b,c) --> 0 nil nil
- 索引
对 table 的索引使用方括号 []。Lua 也提供了 . 操作。
t[i]
t.i -- 当索引为字符串类型时的一种简化写法
gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用
> t = {}
> t["key"] = "a"
> print(t["key"])
a
> print(t.key)
a
>
- Lua for 循环
Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。
Lua 编程语言中 for语句有两大类::
数值for循环
泛型for循环
(1)数值for循环
a = 5 --步长,循环的次数
for i = 1, a do
print(i)
end
结果
PS E:\Domes\lua\test1> lua .\test4.lua
1
2
3
4
5
PS E:\Domes\lua\test1>
(2)泛型for循环
泛型 for 循环通过一个迭代器函数来遍历所有值,类似 java 中的 foreach 语句。
Lua 编程语言中泛型 for 循环语法格式:
--打印数组a的所有值
a = {"one", "two", "three"}
for i, v in ipairs(a) do
print(i, v)
end
结果:
PS E:\Domes\lua\test1> lua .\test4.lua
1 one
2 two
3 three
PS E:\Domes\lua\test1>
- Lua 流程控制
Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码,在条件为 false 时执行其他指定代码。
控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。
--[ 0 为 true ]
if(0)
then
print("0 为 true")
end
结果:
0 为 true
--[ 定义变量 --]
a = 100;
--[ 检查条件 --]
if( a < 20 )
then
--[ if 条件为 true 时执行该语句块 --]
print("a 小于 20" )
else
--[ if 条件为 false 时执行该语句块 --]
print("a 大于 20" )
end
print("a 的值为 :", a)
结果:
a 大于 20
a 的值为 : 100
--[ 定义变量 --]
a = 100
--[ 检查布尔条件 --]
if( a == 10 )
then
--[ 如果条件为 true 打印以下信息 --]
print("a 的值为 10" )
elseif( a == 20 )
then
--[ if else if 条件为 true 时打印以下信息 --]
print("a 的值为 20" )
elseif( a == 30 )
then
--[ if else if condition 条件为 true 时打印以下信息 --]
print("a 的值为 30" )
else
--[ 以上条件语句没有一个为 true 时打印以下信息 --]
print("没有匹配 a 的值" )
end
print("a 的真实值为: ", a )
结果:
没有匹配 a 的值
a 的真实值为: 100
- 数组
数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。
Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。
(1)一维数组
一维数组是最简单的数组,其逻辑结构是线性表。一维数组可以用for循环出数组中的元素,如下实例
array = {"a", "b"}
for i= 1, #array do
print(array[i])
end
结果:
nil
a
b
(2)多维数组
多维数组即数组中包含数组或一维数组的索引键对应一个数组。
以下是一个三行三列的阵列多维数组
array = {{1,2,3},
{4,5,6}}
for i= 1, #array do
for j = 1,#array[i] do
print(array[i][j])
end
end
结果:
PS E:\Domes\lua\test1> lua .\test4.lua
1
2
3
4
5
6
PS E:\Domes\lua\test1>
先写到这。。。快爆毙了歇一会。。。