参考Lua的菜鸟教程,这里写下来是方便自己查阅。
Lua的关键字
以下列出了 Lua 的保留关键字。保留关键字不能作为常量或变量或其他用户自定义标示符:
and | break | do | else |
---|---|---|---|
elseif | end | false | for |
function | if | in | local |
nil | not | or | repeat |
return | then | true | until |
while | goto |
一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。
Lua的注释
使用 -- 做单行注释
使用 --[[ --]]做多行注释
Lua 数据类型
Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。
数据类型 | 描述 |
---|---|
nil | 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。 |
boolean | 包含两个值:false和true。 |
number | 表示双精度类型的实浮点数 |
string | 字符串由一对双引号或单引号来表示 |
function | 由 C 或 Lua 编写的函数 |
userdata | 表示任意存储在变量中的C数据结构 |
thread | 表示执行的独立线路,用于执行协同程序 |
table | Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。 |
我们可以使用 type 函数测试给定变量或者值的类型:
print(type("Hello"))
注意字符串可以使用单引号、双引号、或者[[ ]]。最后一个类似于Python的三引号字符串。
--table类型用花括号包裹,如下
t = {1, '5', ["sss"] = 52, 's'}
--其中可以直接是值或者变量,也可以是键值对的形式,注意索引的时候下标是从1开始的
--且键值对不能使用下标访问
t[1] --是1
t[3] --是's'
t["sss"] --是52
--下面的例子是如果为一个不存在的索引赋值,将会创建该索引
a = {}
a[5] = 5
a["zzz"] = "zun"
print(a[5]) --输出5
print(a["zzz"]) --输出"zun"
print(a.zzz) --输出"zun" table中的键值可以使用'.'来访问
--如果给table中的位置,或者键赋值为nil则表示从table中删除他们,同样全局变量也可以如此删除
lua的字符串使用 '..'连接不是使用加号。
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束。
for i = 0, 5, 2
do
local a = 50
end
print(a) --打印为nil 因为a是local的,如果去掉local修饰这里就会打印50,所以lua要注意只要没哟local修饰就都是全局变量,不是是声明在循环体内部还是函数内部
function abs()
c = 2
end
abs()
print(c) --打印为2,当然如果函数不调用一下的话c还是未定义的
应该尽可能的使用局部变量,有两个好处:
- 避免命名冲突。
- 访问局部变量的速度比全局变量更快。
循环
Lua中的循环
a=10
while( a < 20 ) --实测这个小括号不是必须的去掉也可以
do --do 不能忘
print("a 的值为:", a) --缩进只是为了好看不想Python是用来区分语句块的
a = a+1 --亲测a++、a += 1 都没用会报错看来都不支持
end
Lua 编程语言中数值 for 循环语法格式:
for var=exp1,exp2,exp3 do
<执行体>
end
var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 "执行体",也就是说如果exp3是一个函数的返回值的话这个函数只会被执行一次。exp3 是可选的,如果不指定,默认为1,当然可以设置为负数,这样每次都是递减。
for i=10,1,-1 do --加上小括号是不行的会报错,同样do也不能去掉,注意变为1 的时候仍然执行
print(i)
end
print(i) --打印nil 表明在for里面声明的i变量是local的
Lua 编程语言中 repeat...until 循环语法格式:
repeat
statements
until( condition )
我们注意到循环条件判断语句(condition)在循环体末尾部分,所以在条件进行判断前循环体都会执行一次。
这就是do..while了。
a = 10
repeat
print("a的值为:", a)
a = a + 1
until a > 15 --同样不加小括号也可以,最好还是加上看起来不费劲
控制
a = 2
if (a == 1) --要不要括号都行最好带上便于阅读,但是then不能缺
then
print(a)
elseif a == 2
then --这个then也不能缺
print("a is 2")
else --这里就不需要then了
print("This is else.")
end
函数
定义格式如下:
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
解析:
- optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。
- function_name: 指定函数名称。
- argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。
- function_body: 函数体,函数中需要执行的代码语句块。
- result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。
--[[ 函数返回两个值的最大值 --]]
function max(num1, num2)
if (num1 > num2) then
result = num1; --心累,这语言才发现加上 ; 结尾一个语句和不加都可以运行
else
result = num2;
end
return result;
end
-- 调用函数
print("两值比较最大值为 ",max(10,4));
print("两值比较最大值为 ",max(5,6));
myprint = function(param)
print("这是打印函数 - ##",param,"##")
end
function add(num1,num2,functionPrint) --所以参数其实传入什么都可以,只要可以在函数内使用正确就行
result = num1 + num2
-- 调用传递的函数参数
functionPrint(result)
end
myprint(10)
-- myprint 函数作为参数传递
add(2,5,myprint)
函数也可以有多个返回值,只要使用','隔开就好。
Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 ... 表示函数有可变的参数。
function add(...) --可以在函数内使用 a = {...}的语句将可变参数赋值给变量,这样就可以操作这个变量来获取,诸如访问每一个参数,获取程度等操作
local s = 0
for i, v in ipairs{...} do --> {...} 表示一个由所有变长参数构成的数组
s = s + v
end
return s
end
print(add(3,4,5,6,7)) --->25
我们可以将可变参数赋值给一个变量。
通常在遍历变长参数的时候只需要使用 {…},然而变长参数可能会包含一些 nil,那么就可以用 select 函数来访问变长参数了:select('#', …) 或者 select(n, …)
select('#', …) 返回可变参数的长度
-
select(n, …) 用于返回 n 到 select('#',…) 的参数。select(n, ...) --数字n表示起点,select(n, ...)返回从起点n到结束的可变参数,比如:
n=3,... 是 0,1,2,3,4,5
则 select(n, ...) 就表示...中从第3个到最后一个的多个数:2,3,4,5。并且2,3,4,5是4个数,不是列表或其他的数据结构。所以, 下面的代码中,a = select(3,...) 就表示的是 a = 2,3,4,5。这就相当于复制变量大于值的情况,所以,a=2。
调用select时,必须传入一个固定实参selector(选择开关)和一系列变长参数。如果selector为数字n,那么select返回它的第n个可变实参,否则只能为字符串"#",这样select会返回变长参数的总数。
function mytest(a, ...) --可变实参和普通参数可以混用
local t = select('#', ...) --获取可变实参的长度
print(t)
local b = {...}--将可变实参传递给变量,然后通过变量访问其内容,但是这样如果访问越界不会报错
print(b[1])
end
mytest(5, 6, 7, 8)
do
function foo(...)
for i = 1, select('#', ...) do -->获取参数总数
local arg = select(i, ...); -->读取参数 采取这样的方式可以读取可变实参而不会越界
print("arg", arg);
end
end
foo(1, 2, 3, 4);
end