--[[在默认情况下,变量总是认为是全局的,全局变量不需要声明,给
一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会
出错,只不过得到的结果是:nil,如果你想删除一个全局变量,只需要将变量
复制为nil,这样变量b就好像从没被使用过一样]]
--示例如下:
--[[b=nil
print (b)--b已被删除]]
--使用type函数来获取数据的类型
--示例如下:
--[[print(type("hello world"))
print(type(9.98))
print(type(print))
print(type(true))
print(type(nil))
print(type(type(x)))]]
--[[输出结果为:
string
number
function
boolean
nil
string
]]
--[[对于全局变量和table,nil还有一个“删除“的作用,给全局变量或者table
表里的变量赋一个nil值,等同于把它们删除]]
--示例如下:
--[[tab={key1="value1",key2="value2","value3"}
for k,v in pairs(tab) do
print(k.."--"..v)--k后面的..和v前面的..是固定的,不能换成其他符号,因为在Lua中..用来连接两个字符串
end
tab.key1=nil
for k,v in pairs(tab) do
print(k.."--"..v)
end]]
--[[输出结果为:
1--value3
key1--value1
key2--value2
1--value3
key2--value2
]]
--nil作比较时应该加上双引号”
--示例如下:
--[[print(type(x)==nil)
print(type(x)=="nil")]]
--[[输出结果为:
false
true
]]
--Lua把false和nil看作是“假",其他的都为“真“
--示例如下:
--[[if false or nil then
print("至少有一个是true")
else
print("false和nil都为false")
end]]
--[[输出结果为:
false和nil都为false
]]
--Lua默认只有一种number类型double(双精度)类型
--示例如下:
--[[print(type(2))
print(type(2.2))
print(type(2e-1))]]
--[[输出结果为:
number
number
number
]]
--字符串由一对双引号或单引号来表示,也可以用2个方括号[[]]来表示一块字符串
--示例如下:
--html = [[
--[[
菜鸟教程
]]
--]]
--print(html)
--[[输出结果为:
菜鸟教程
]]
--在对一个数字字符串进行算术操作时,Lua会尝试将这个数字字符串转成一个数字
--示例如下:
--[[print("2"+6)
print("2"+"6")]]
--[[输出结果为:
8
8
]]
--字符串连接使用的是..
--示例如下:
--[[print("a".."b")
print(123 .. 456)--注意这里的数字和..之间有空格了,不然会报malformed number near '123..456'错误
]]
--[[输出结果为:
ab
123456
]]
--使用#来计算字符串的长度,放在字符串前面
--示例如下:
--[[str="hello world"
print(#str)
print(#"hello world")]]
--[[输出结果为:
11
11
]]
--表(table)的创建,最简单的表达式是{},用来创建一个空表,也可以在表里添加一些数据,直接初始化表
--示例如下:
--[[local tab={}
local tab1={"1","2","3"}
for k in pairs(tab1) do
print(k)
end]]
--[[输出结果为:
1
2
3
]]
--table其实是一个”关联数组“,数组的索引可以是数字或者是字符串
--示例如下:
--[[a={}
a["key"]="value"
key=10
a[key]=22
a[key]=a[key]+11
for k, v in pairs(a) do
print(k.."--"..v)
end]]
--[[输出结果为:
key--value
10--33
]]
--不同于其他语言的数组把0作为数组的初始索引,在Lua里表的默认初始索引一般以1开始
--[[local tab={"1","2","3"}
for key in pairs(tab) do
print("key:",key)--逗号在这里相当于制表符
end]]
--[[输出结果为:
key: 1
key: 2
key: 3
]]
--table不会固定长度大小,有新数据添加时table长度会自动增长,没初始的table都是nil
--[[a={}
for i=1,10 do
a[i]=i
end
a["key"]="val"
print(a["key"])
print(a["key1"])
print(a[4])
print(a[9])]]
--[[输出结果为:
val
nil
4
9
]]
--函数被看作是第一类值,函数可以存在变量里
--示例如下:
--[[function lianxi(a)
if a==0 then
return a
else
return a+lianxi(a-1)
end
end
print(lianxi(1))
print(lianxi(2))
bianliang=lianxi--这里用一个变量来存放函数
print(bianliang(3))]]
--[[输出结果为:
1
3
6
]]
--function可以以匿名函数的方式通过参数传递
--示例如下:
--[[function testFun(tab,fun)
for k,v in pairs(tab) do
print(fun(k,v))
end
end
tab={key="value",key1=22}
testFun(tab,
function(k,v)--匿名函数
return "我是匿名函数:"..k.."--"..v
end
)]]
--[[输出结果为:
我是匿名函数:key--value
我是匿名函数:key1--22
]]
--[[在Lua里,最主要的线程是协同程序(coroutine)。它和线程(thread)差不多,拥有自己
独立的栈,局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西
线程和协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于
运行状态的协程只有被挂起(suspend)时才会暂停]]
--[[userdata是一种用户自定义数据,用于表示一种由应用程序或c/c++语言库索创建的类型,
可以将任意c/c++的任意数据类型的数据(通常是struct和指针)存储到Lua变量中调用]]
--[[Lua变量有三种类型:全局变量,局部变量,表中的域;
Lua中的变量全是全局变量,哪怕是语句块或是函数里,除非用local显式声明为局部变量;
局部变量的作用域从声明位置开始到所在语句块结束;
变量的默认值均为nil]]
--示例如下:
a=5--全局变量
--[[local b=5--局部变量
function fun()
c=5--全局变量
local d=5--局部变量
end
fun()
print(c,d)
do
local a=6--局部变量
b=6--对全局变量重新赋值
print(a,b)
end
print(a,b)]]
--[[输出结果为:
5 nil
6 6
5 6
]]
--[[Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值
语句右边的值会一次赋给左边的变量。遇到赋值语句Lua会计算右边所有的值然后
再执行赋值2操作]]
--示例如下:
--[[a,b=22,'abcd'
print(a..b)]]
--[[输出结果为:
22abcd
]]
--[[当变量的个数和值的个数不一致时:
变量个数>值的个数 按变量个数补足nil
变量个数<值的个数 多余的值会被忽略]]
--示例如下:
--[[a,b,c=0,1
print(a,b,c)
a,b,c=1,2,3,4
print(a,b,c)]]
--[[输出结果为:
0 1 nil
1 2 3
]]
--[[多值赋值还可以获取函数调用返回的值,比如a,b=f(),其中f()返回两个值,
第一个赋给a,第二个赋给b]]
--[[应该尽可能的使用局部变量,有两个好处:
1.避免命名冲突
2.访问局部变量的速度比全局变量更快]]
--对table的索引使用[]或者是.操作
--示例如下:
--[[site={}
site["key"]="我是值"
print(site["key"])
print(site.key)]]
--[[输出结果为:
我是值
我是值
]]
--Lua中0为true
--示例如下:
--[[if 0 then
print('0是true')
else
print('0是false')
end]]
--[[输出结果为:
0是true
]]
--[[函数可以设定范围,默认情况下是全局函数,局部函数用local进行修饰,
函数返回值可以有多个,每个值用逗号隔开,
Lua中我们可以将函数作为参数传递给函数,
Lua函数可以接受可变数目的参数,在函数参数列表中使用...表示函数有可变的参数,
调用select时,必须传入一个固定实参selector(选择开关)和一系列变长参数。如果
selector为数字n,那么select返回它的第n个可变实参,否则只能为字符串"#",这样
select会返回变长参数的总数]]
--示例如下:
--[[function foo(...)
print(select('#',...))
for i = 1, select('#', ...) do -->获取参数总数
local arg = select(i, ...); -->读取参数
print("arg", arg);
end
end
foo(1,2,3,4)]]
--[[输出结果为:
4
arg 1
arg 2
arg 3
arg 4
]]
--#能够输出table中的个数或者是字符串的长度
--[[tab={"1","2","3","4"}
print(#tab)
print(#"hello")]]
--[[输出结果为
4
5
]]
--Lua中不等于是~=
--示例如下:
--[[if(3~=4) then
print("3不等于4")
end]]
--[[输出结果:
3不等于4
]]
--逻辑运算符:and,or,not
--示例如下:
--[[if(3==3 and 4==4) then
print("and满足了")
end
if(3==3 or 4==4) then
print("or满足了")
end
if(not 4~=4) then
print("not满足了")
end]]
--[[输出结果为:
and满足了
or满足了
not满足了
]]
--字符串的三种表示方式
--示例如下:
--str='hello,world'
--str1="hello,world"
--str2=[["hello,world"]]
--[[print(str)
print(str1)
print(str2)]]
--[[输出结果为:
hello,world
hello,world
"hello,world"
]]
--默认情况下数组的下标是从1开始的,但是可以自己设置数组的下标
--示例如下:
--[[array={}
for i=-2,2 do
array[i]=i+10
end
for i=-2,2 do
print(array[i])
end]]
--[[输出结果为:
8
9
10
11
12
]]
--Lua迭代器,k, v为变量列表;pairs(t)为表达式列表
--示例如下:
--[[t={a="2",b="22",c="12",d="9"}
for k, v in pairs(t) do
print(k, v)
end]]
--[[输出结果为:可以看到输出结果默认还排序了
a 2
d 9
c 12
b 22
]]
--module.lua文件放在lua软件的安装路径下
--[[module.lua文件中的内容如下:
module={}
module.changliang="我是module中的一个常量"
function module.fun1()
return "我是module中的fun1"
end
function module.fun2()
return "我是module中的fun2"
end
return module
]]
--[[
require("module")--导入模块
print(module.changliang)
print(module.fun1())
print(module.fun2())
]]
--[[输出结果为:
我是module中的一个常量
我是module中的fun1
我是module中的fun2
]]