-- pairs 获得表的键值对 key,val 分别对应着键和值-- for 变量列表 in 迭代函数 状态变量 控制变量 dofor key, val inpairs(table)doprint(key .." ".. val)end-- 变量名及其初始值,最大值,步长(可省略)for i =1,10,1doprint(i)end-- 等同于 do while,但仅在until为 假 时继续重复执行(until 直到…为止)repeat..untiltrue
6. 函数
-- 一般函数 (可返回多变量)functionfact(m)return m
end-- 函数作为参数的函数functionprintFun(data, fun)print(fun(data))end-- 匿名函数
printFun =function(m)print(m)end-- 可变参数functionprintFun(...)local arg ={
...}for index, value inpairs(arg)doprint(index, value)endend
7. 全局变量和局部变量
局部变量的声明:local data = "value"
即便是在函数内声明全局变量,仍旧可在外部访问
只要声明局部变量,再次在局部调用时无需重复声明
8. 字符串操作
string 类静态方法
方法
描述
upper(str)
全部大写
lower(str)
全部小写
gsub(str, str1, str2, number)
将str中的str1替换为str2,number为限制替换次数(若传入)
find(str, str1, number)
查找str中str1第一次出现的位置,number为开始索引
reverse(str)
翻转字符串
format(“%s %.3f %03d”, str, 1.23, 1)
字符串拼接(同C)
char(number…)
将数值们变成ascil字符串
byte(str, number)
将number位的字符变成ascil码
gmatch(str, str1)
返回str中符合正则表达式str1的函数,可用for遍历结果
for word in string.gmatch("Hello world!","l.")doprint(word)end
9. 迭代器函数-pairs ipairs
pairs 遍历所有键值对。
ipairs 仅仅遍历数键,从1开始,一旦缺失立刻终止迭代。
自定义迭代函数
-- 状态变量:最值 控制变量:每轮改变的值。当返回为nil时迭代立刻结束functionsquare(state, control)if control >= state thenreturnnilelse
control = control +1return control, control ^2endendfor index, value in square,9,0doprint(index, value)end
-- 常规定义
class ={
name ="liluo",
age =21,
eat =function(self)print(self.name .." eat")end}
class.eat(class)-- 冒号定义function class:say()print(self.name .." say")end
class:eat()
class:say()
构造函数
class ={
name ="liluo",
age =21}function class:new()local t ={
}setmetatable(t,{
-- 调用一个属性时,如果t不存在,则到基类中查找
__index = self
})return t
end
c = class:new()-- 可得到类名print(c.name)print(class.name)-- 即便修改也不会影响原类,因为其本质是在类c中新建加一个变量
c.name =123print(c.name)print(class.name)
构造函数可设基础入参为表
Person ={
name ="liluo",
age =21}function Person:new(o)local t = o or{
}setmetatable(t,{
-- 调用一个属性时,如果t不存在,则到基类中查找
__index = self
})return t
end
Student = Person:new({
grade =3})-- stu 的基类是Student,Student的基类是Person
stu = Student:new()print(stu.name)print(stu.grade)
继承
require("Class")--类的继承
SubClass ={
z =0}--声明新的属性Z--两步完成类Class的继承setmetatable(SubClass, Class)--设置类型是class
SubClass.__index = SubClass --设置表的索引为自身--构造方法,习惯性命名new()function SubClass:new(x, y, z)local t ={
}--初始化对象自身
t = Class:new(x, y)--将对象自身设定为父类,相当于C#里的basesetmetatable(t, SubClass)--将对象自身元表设定为SubClass
t.z = z --新属性赋值return t
end--定义一个新的方法function SubClass:go()
self.x = self.x +10end--重定义父类的方法,相当于overridefunction SubClass:test()print(self.x, self.y, self.z)// base
Class.test(self)end