速通1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <! <p> <!
<! <p> <!
<! <p>一个汉字占3个字符:a = 'abc字符串' #a = 12</p> <!
### lua中的数据类型
<! <p>数字number 、 字符串string 、布尔boollean 、 空nil</p> <!
<! <p>函数function 、 表table 、数据结构 userdata、 协同程序thread</p> <!
### 三目运算符(模拟)
<! <p>(1 > 2) and "1大于2" or "1不大于2"</p> <!
### 循环
#### while循环
```lua num = 0 while num < 5 do print(num) num = num + 1 end
|
repeat until
1 2 3 4 5
| num = 0 repeat print(num) num = num + 1 until num > 10
|
for循环
1 2 3
| for i = 1, 10, 1 do print(i) end
|
函数
没有函数的重载
形参,多了少了不会报错,可以用多个临时变量接取
1 2 3
| function helloWorld() print("Hello World!") end
|
table表
推荐用pairs
1 2 3 4 5 6 7 8 9
| for i, v in ipairs(arr) do print(i, v) end
for k, v in pairs(t) do print(k, v) end
|
用table实现类
1 2 3 4 5 6 7 8 9 10 11 12 13
| student = { name = "xuzhuo", age = 20, gender = "male", fun = function() print("My name is " .. student.name) end }
function student:speek() print("My name is " .. self.name) end
|
点和冒号的区别:冒号在访问函数的时候,会将自己当作第一个参数传入进去
多脚本执行
全局变量和局部变量
a = 10 全局变量
local c = "aaaa" 局部变量
多脚本执行
require("对应的脚本")
卸载脚本
package.loaded["text"] = nil
大G表
所有的全局变量都以键值对的形式存在于大G表中 _G
特殊用法
多变量赋值
多返回值
1 2 3 4 5
| function test() return 1, 2, 3, 4 end a, b, c = test() print(a, b, c)
|
and or
--在lua中只有 uil 和 false才是假
--短路:对于and来说 有假则假 对于or来说 有真则真
--所以 它们只要判断出第一个 是否满足 就会停止计算了
协程
协程的本质是一个线程
协程创建
1.coroutine.create(函数) 返回值是一个thread对象
2.coroutine.wrap(函数) 返回值 一个函数
协程的运行
coroutine.resume(协程对象)
直接调用函数(用wrap创建的)
协程挂起
coroutine.yield(返回值)
协程状态
coroutine.status(协程或者协程函数)
--dead表示协程已经执行完毕,没有挂起的状态
--suspended表示协程正在挂起,没有执行完毕的状态
--running表示协程正在执行的状态
元表
概念
--任何表变量都可以有自己的元表(爸爸)
--当我们子表中进行特定操作时,会执行元表中的方法
设置元表
--第一个参数子表、第二个参数元表(爸爸)
setmetatable(MyTable, meta)
特定操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| meta = { __index = { age = 190 },
__newindex = {
},
__tostring = function(str) return "我是爸爸:" .. str.name end,
__call = function() print("我是爸爸,我正在给你打电话...") end,
__add = function(a, b) return a.name + b.name end,
__sub = function(a, b) return a.name - b.name end }
|
--rawset 该方法会忽略newindex的设置,只会该自己的变量
rawset(MyTable, "age", 180)
print(MyTable.age)
面向对象
封装
1.表就是类的表现方法
2.修改创建出来的成岩变量时,就为了这个空表对象新建了一个成员属性
继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| function Object:subClass(className) _G[className] = {} local subClass = _G[className] subClass.base = self subClass.__index = subClass setmetatable(subClass, { __index = self }) end
function Object:new() local obj = {} self.__index = self setmetatable(obj, self) return obj end
|
setmetatable(subClass, { __index = self })
用于子类的继承,通过一个新元表实现当子类查找不到属性时,到父类中查找;
setmetatable(obj, self)
用于实例化对象,直接将类作为元表,使对象继承类的方法和属性(前提是类中要设置好 __index
)。
多态
直接重写方法
1 2 3 4 5 6 7 8 9 10 11 12
| function GameObject:move() self.Posx = self.Posx + 1 self.Posy = self.Posy + 1 print("GameObject move to:", self.Posx, self.Posy) end
GameObject:subClass("Player")
function Player:move() self.base.move(self) end
|
自带库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| print(os.time())
print(os.time { year = 2021, month = 3, day = 25, hour = 13, min = 30, sec = 0 })
print(os.date())
print(math.abs(-10))
print(math.deg(math.pi / 2))
print(math.cos(math.pi / 4))
print(math.floor(2.6))
print(math.ceil(2.4))
print(math.max(1, 2, 3, 4, 5))
print(math.min(1, 2, 3, 4, 5))
print(math.random())
print(math.random(1, 10))
print(math.sqrt(9))
print(string.byte("hello"))
print(string.char(97, 98, 99))
print(string.len("hello"))
print(string.lower("HELLO"))
print(string.upper("hello"))
print(string.rep("hello", 3))
print(string.sub("hello", 2, 4))
|
垃圾回收
collectgarbage("count") --获取当前lua占用的内存
collectgarbage("collect") -- 启动一次自动的垃圾回收
```