0. 扫盲
0.1 Lua基础简明教程
-> 参考文档:https://www.zybuluo.com/lisaisacat/note/636399
-> Lua字符串:www.runoob.com/lua/lua-strings.html
-> Mac上Sublime Text3配置Lua环境:https://www.jianshu.com/p/3bbb2a040fed
-> Mac上Sublime Text3配置安装Lua环境:https://segmentfault.com/a/1190000017494363
-> Mac上Sublime Text3配置安装Lua环境:https://www.cnblogs.com/baaingSheep/p/5145045.html
1. Lua编程Basic
1.1 注释备注
// 相当于//
-- 单行注释
// 相当于/**/,由"--[["表示注释开始,并且一直延续到"]]"为止。在注释当中,"[["和"]]"是可以嵌套的
--[[多行注释]]
1.2 语句块
// 等同于{},可以在函数中和语句块中定义局部变量
do … end
do print("Hello world") end
1.3 赋值语句(不需要声明,可以给多个变量赋值)
// 默认是全局变量
a,b,c,d=1,2,3,4
// 交换变量数值
a,b=b,a
// 局部变量,定义时,第一次赋值时,需要用local说明
local a=1
1.4 分支 条件控制
// 相当于if(x){}
if x then … end
if x then … else … end
if x then … elseif x then … else... end
1.5 循环语句
->主要循环类型:
--1\. while (true) do ... end(等同于while(){…})
--2\. repeat … until (true) (等同于 do {} while(!a))
--3\. for 变量i=起始值a, 最大值b,步进值c do … end (等同于与 for(int i=a,i<=b,i+=c){…},步进值默认为 1,可省略,相当于i++)
--4\. for 变量1,变量2,..,变量N in表/枚举函数 do … end
--1. while (true) do ... end 等同于while(){...}
my_table = {1,2,3}
local index = 1 -- 注意: table 中的索引从1开始
while my_table[index] do -- 只要条件返回True,就一直执行循环
print(my_table[index])
index = index + 1 -- Lua中没有i++ 的写法,所以只能用i=I+1
end
-- 输出 1
-- 2
-- 3
--2.repeat … until (true) 等同于do...while
local snum = 1 --起始值
repeat
print("snum is "..snum)
snum = snum + 1
until snum == 4 --当snum 等于 4 时(条件是True) 跳出循环
--输出:
--snum is 1
--snum is 2
--snum is 3
->PS注意:for的循环变量总是只作用于for的局部变量,可以用break来中止一个循环。
--3.for i=a, b,c do … end (步进值c默认为1,可省略)
for i = 1, 6, 2 do --这里i=1表示起始值, 10表示最大值, 2表示步进值(等同于i+2)
print("i = "..i)
end
--输出:
--i = 1
--i = 3
--i = 5
--4.for 变量1,变量2,..,变量N in表/枚举函数 do … end for循环练习 arr={1,2,3} for i=1,#arr do … end
arr={1,2,3}
for i = 1, #arr do -- #arr表示取表的长度,相当于OC的.count(步进值默认值为1,等同于i++)
print("arr[i] = "..arr[I])
end
-- 输出:步进值默认为1,从arr[1]开始循环输出
--arr[i] = 1
--arr[i] = 2
--arr[i] = 3
1.6 运算
->大致类型
--1\. 数值运算(+, -, *, /,^)
--2\. 比较运算(<, >, <=, >=, ==, ~=)所有这些操作符总是返回 true 或 false。
--3\. 逻辑运算 (and, or, not)
--1. ^ 乘方
2^3 // 8
--2. ~= 不等于
对于Table,Function和Userdata类型的数据,只有 == 和 ~=可以用。相等表示两个变量引用的是同一个数据。比如:
// PS: Table类型相当于对象类型,和OC创建对象产生所属地址的形式一样。
a={1,2}
b=a
print(a==b, a~=b) -- true, false -- a==b,两个变量引用同一个数据
a={1,2}
b={1,2}
print(a==b, a~=b) -- false, true —-两个对象
--3. and 与(找假),只有 false 和 nil 才计算为 false
a and b: 如果a为false,则返回a;否则返回b
5 and 6 // 6
nil and 6 // nil
false and 6 // false
--4. or 或(找真),0和空串 也是 true
a or b: 如果 a 为true,则返回a;否则返回b
5 or 6 // 5
nil or 6 // 6
0 or 6 // 0
// 常用
x = x or v(等同于 if not x then x = v end )
// 三目(等同于 x=a?b:c)
x = a and b or c
--5. not 非
--6. 优先级
^
not(一元运算),
*/,
+-,
..(字符串连接),
< > <= >= ~= ==,
and,
or,
1.7 字符串拼接".."运处符
"hello," .. "world." -- 等于 “hello,world."
1.8 关键字(不能做变量)
and、or、not、break、do、end、if、else、elseif、false、for、function、in、local、nil、repeat、return、then、true、until、while
2. 变量类型及定义
2.1 变量类型的分类:
--1\. Nil 空值
--2\. Boolean 布尔值
--3\. Number 数值
--4\. String 字符串
--5\. Table 关系表类型
--6\. Function 函数类型
--7\. Userdata
--8.Thread 线程类型
2.2 判断变量类型的函数
// 判读类型:返回string
type()函数
2.3 具体的变量类型
--1. nil 空值
未定义(没有使用过)的值,都是nil。nil既是值,又是类型。
// 用法:
将一个变量清除,可直接给变量赋以nil值。
a = nil -- 请注意nil一定要小写
--2. Boolean 布尔值
true/false(只有false和nil是false,0不是false)
// 用法:通常用在进行条件判断的时候
可以直接给一个变量赋以Boolean类型的值
varboolean = true
--3. Number 数值
相当于C中的double,在Lua中,是没有整数类型的,也不需要。
print(0.4); -- 0.4
print(4e-3); -- 0.004
print(4e2); -- 400.0 =( 4X10^2)
print(4e+2); -- 400.0
--4. String 字符串
4.1 String 字符串,字符串可以包含'\0'字符的
“bzc”
‘ab’
[[ abc\c\d ]] --用"[["和"]]"将多行的字符串括起来
4.2 转义字符
\a -- 响铃(BEL)
\b -- 后退
\f -- 换页
\n -- 换行
\r -- 回车
\t -- 制表
\v -- 垂直制表(VT) vertical tab
\\ -- “\"
\" -- 双引号
\' -- 单引号
\[ -- 左中括号
\] -- 右中括号
4.3 替换
-- string.gsub (s, pattern, repl [, n])
str = "abc";
newstring = string.**gsub**(str,"ab","cd"); -- cdc
4.4 拼接
str = "abc" **..** "de"// abcde
4.5 转换
// string转number
**tonumber**("10”)
// number转string
**tostring**(10)
// 自动转number
str = “10”**+** 1 -- 11
4.6 查找
// 返回两个参数,开始坐标,结束坐标 string.find (s, pattern [, init [, plain]])
startIndex, endIndex = string.**find**("hello world","llo”); —- 3 5
www.runoob.com/lua/lua-strings.html
--5. Table 关系表类型
可以看做是一个数组,里面可以放任意类型(除了nil),从1开始;也可以用任意类型来做数组的索引(除了nil)。
我们在写的时候,需要注意三点:
第一,所有元素之间,总是用逗号","隔开;
第二,所有索引值都需要用"["和"]"括起来;如果是字符串,还可以去掉引号和中括号;
第三,如果不写索引,则索引就会被认为是数字,并按顺序自动从1往后编。
arr = {1,2,3,4,5,6,7}
dict = {} -- 定义一个空表
dict[0] = 5 -- 然后我们就可以象C语言一样来使用它了
dict["arr”] = arr;
dict[arr] = {0,1};
dict = {
10, --相当于[1]=10 —-不加下标的优先排
[100] = 44,
Zl = -- 如果你原意,你还可以写成:["Zl"] =
{
age=18,--相当于["age”]=18
sex=“nv”
},
20 --相当于[2]=20
}
// key是字符串的时候可以用.来访问(当表的索引是字符串的时候,我们可以简写成点的方式获取)
dict.arr=“bb”
// 获取长度(去找nil结束的#运算符)
len = #dict.arr —- 上述dict的zl为2
遍历
// 依下标遍历(ipairs)。碰到nil退出
arr = {[1]=3, [2]=5, [5]=6} —-i下标是1和2;V结果为3和5
for i,v in ipairs(arr) do
print("i = "..i)
print("v = "..v)
end
--输出:
--i = 1
--v = 3
--i = 2
--v = 5
// 遍历所有(pairs)
arr = {[1]=3, [5]=6}
for k,v in pairs(arr) do
print(k,v)
end
// 遍历所有,步进值默认为1
for i=1,10 do --这里i=1表示起始值, 10表示最大值,(步进值可以没有,默认值为1,也就是其他语言里的i++)
print(i)
end
类相关
-- 定义一个对象
ZL = {
name = "zl";
Age = 18,
Gender = girl,
show = function ( this )
print("My name is "..this.name)
end
}
—- 也可以放在table外面定义方法
ZL.show = function ( this, a )
print("My name is "..this.name.."\n外界传值为"..a)
end
调用方法
// 调用方法
ZL**.**show(ZL, 666)
ZL **: **show(666)
--6. Function 函数类型
注意事项:用触动精灵开发脚本时,要把封装函数写在调用前面,因为脚本是按照从上到下的顺序执行的。
// 定义 函数也是一种类型,也就是说,所有的函数,它本身就是一个变量。
-- 定义
function sum( a,b ) --sum 是函数名字,a和b是参数名字
return a,b -- return 用来返回函数的运行结果
end
sum = function ( a,b )
return a,b
end
调用:当调用结果作为参数的时候,只有一个参数,或者是最后一个参数的时候,返回多个,其他的情况返回一个
-- 调用
sum(5,6)
-- 当调用结果作为参数的时候,只有一个参数,或者是最后一个参数的时候,返回多个,其他的情况返回一个
print(sum(5,6)) -- 5,6
print(sum(5,6),1) -- 5,1
print(2,sum(5,6)) -- 2,5,6
-- 可以用()强制函数值返回一个值
print((sum(5,6))) -- 5
// unpack(a):返回返回a的所有元素做为参数
// f(unpack(a))等同于string.find(“hello”,”11")
f = string.find
a = {"hello", "ll”}
print(f(unpack(a)))
// 可变长参数
function sum( x,... )
// 获取可变参数列表
arg = { ... }
local s = 0
for i,v in ipairs(arg) do
s=s+v
end
return s
end
print(sum(5,6,7,8,9))
--7. Userdata
用于与Lua的宿主打交道.宿主通常是用C和C++来编写的,Userdata可以是宿主的任意数据类型,常用的有Struct结构体和指针.
--8. Thread 线程类型
在Lua中没有真正的线程。Lua中可以将一个函数分成几部份运行。
网友评论