lua虽然没有面向对象的概念,但我们实现面向对象并不困难
一下内容我参考了多处lua教程,很多教程讲解模糊晦涩,我整理了以下以简明的说明方式完成lua面向对象这部分的内容,希望大家喜欢。
面向对象OOP
学习过Java,C#,Ruby等的同学可能不会对面向对象陌生,如果你是第一次接触面向对象?
那么我总结一下就是:将事物抽象成类,将特征抽象为字段和属性。
在Lua中,最强大的就是table这种数据结构了,来看下面这个例子:
Cat={name="defalut",color="白色"}
function Cat.say()
print(Cat.name..' '..Cat.color..':','喵喵喵~')
end
Cat.name='小白'
Cat.say()
运行结果为:小白 白色: 喵喵喵~
在例子中,我们创建了一张表,并在表中提供2个字段和一个函数,并通过表名.字段名调用字段和方法,这像不像 一个静态类呢?
以下是Csharp的一个类似的静态类:
class Program
{
static void Main(s ...
平时我们在其他语言中,经常会用到如数组,矩阵,队列和栈等一些数据结构,而lua似乎并没有这些数据类型,lua只提供了table类型,但是通过table类型我们几乎可以实现所有常用的数据类型。
数组
数组的实现非常简单,table的数据类型类似与C#中的字典,存储kv对,我们只取value即可。
1234local arr={1,2,3,6,4}for key, value in pairs(arr) do print(key,value)end
矩阵
矩阵也被称为多维数组,我们只需要嵌套一个table即可。
1234567local mt={}for i = 1, 10 do mt[i]={} for j = 1, 10 do mt[i][j]=0 endend
链表
对于像链表这样的数据结构,我们可以方便的通过一个指针域实现。
-- 链表
local l=nil
local l2={next=nil,value=10}
l={next=l2,value=200}
while l do
...
使用协同程序可以更加高效的处理数据或执行任务
协同的基础
创建协同程序
local co=coroutine.create(function ()
print('Hi')
end)
协程的状态
协同有三个状态:挂起态、运行态、停止态。当我们创建一个协同程序时他开始的状态为挂起态,也就是说我们创建协同程序的时候不会自动运行,可以使用 status 函数检查协同的状态:
print(coroutine.status(co))
启动协程
使用coroutine.resume()可以启动协程
例如:
coroutine.resume(co)
启动协程后,会立即执行协程方法中的内容。
挂起协程
如有需要coroutine.yield()可以挂起协程。
让我们来看下面这个例子,创建一个协程,在协程函数中构建一个循环,并在打印后挂起当前协程,我们不断的去调用协程。
local th=coroutine.create(function ()
for i = 1, 3 do
print("th=",i)
coroutine.yield() ...
lua的特点之一就是方便的调用chunk(代码块)
通过这种特性,我们可以在a.lua中调用b.lua的内容,甚至可以从字符串文本中调用lua当做函数执行~
load
让我们先来看一下load函数的定义:
!{load函数}(https://i.loli.net/2020/02/04/DYGV2CSWoPcL49v.png)
通过定义我们可以知道load函数可以加载文本和二进制类型代码块,来让我们尝试一下:
local f=load('I=I+1')
I=0
f()
print('I='..I)
f()
print('I2='..I)
在这个例子中,我们使用load加载了‘I=I+1’这一串字符串,并把加载结果存储在f中。通过使用f()来调用函数。
loadFile
和load类似的还有loadfile,但loadfile加载的是文件而非字符串。
我们在funTest.lua文件中写一句输出:print(‘Test’)
然后在其他文件中调用:
local fun=loadfile('funTest.lua',"t")
fun()
通过这种形式我们就可以吧funTest.l ...
在前面我们学习函数时,我们说过函数其实是值,我们可以将函数放在表中。
那么我们是不是可以这么做:
12345678local fasty={a=1}function fasty.Say(arg) print('Say:'..arg)endfunction fasty:Say2(arg) print("Say:"..arg)end
在这里,我们创建了一个表fasty,表中默认有a一个元素。然后我们给表创建了两个函数say和say2,这2个函数的作用都是将给与的参数输出。
调用不同
在我们调用这2个方法时,我们应该明确:
使用.声明的方法使用.调用,使用:声明的方法使用:调用
假如我们要使用.调用:声明的方法,那我们需要传递一个this指针给函数
也就是说: 其实是自动传递一个this指针给函数。
123456789101112131415fasty.Say(100)fasty:Say2(200)fasty.Say2(fasty,200)```lua<strong>Ps</strong>: ...
迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。在 Lua 中我们
常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。
闭包和迭代器
迭代器需要保留上一次成功调用的状态
迭代器需要保留下一次成功调用的状态
我们知道闭包可以保留每次调用的状态。并且可以方便的访问局部变量;所以我们也可以使用闭包来构建迭代器。
还记得我们在做for循环遍历表时的pairs(t)的迭代器吗?我们尝试自己来写一个迭代器:
12345678910111213141516171819202122-- 迭代器local function list_iter(t) local i=0 local n=#t return function () i=i+1 if i<=n then return t[i] end endendlocal t={4,5,8} --创建表local iter = list_i ...
函数可以完成2件事,完成工作或者计算并返回结果。
函数语法
function func_name (arguments-list)
statements-list
end
Ps:Lua 使用的函数可以是 Lua 编写也可以是其他语言编写,对于 Lua 程序员来说用什
么语言实现的函数使用起来都一样。
function Show(a)
print(a)
end
Show(100)
返回多个值
在lua中函数可以返回多个值,例如 string.find,其返回匹配串“开始和结束的下标”
(如果不存在匹配串返回 nil)。
s, e = string.find("hello Lua users", "Lua")
print(s, e) --> 7 9
计算最大值和最大值的索引
12345678910111213function MaxM(arr) local maxIndex=1 local max=arr[maxIndex] for key, value in pairs(arr) do if value>max then ...
构建表
构造器是创建和初始化表的表达式。表是 Lua 特有的功能强大的东西。最简单的构
造函数是{},用来创建一个空表。可以直接初始化数组:
表的序号从1开始,并非0。
Ps:假如空引用,lua也不会报错,会输出nil。
12local numbers={1,2,3,4,5,6,7,8,9,0}print("numbers数据:"..tostring(numbers[1])) -- 输出1
构建自定义对象
1234local arr={}arr.name='xiao'arr.age=16print('arr的数据:'..' name:'..arr.name..' age: '..arr.age)
表的组成
表,可以包含任何类型的元素,也可以嵌套
1arr={x=0,tip='text',func=print}
构造注意事项
如果真的需要索引从0开始:
Ps:极力不推荐这么做,这么做将不能使用很多标准库 ...
本系列将从零开始学习Lua的基本语法,用于之后使用xLua进行unity热更新~
使用Vscode开发Lua
至少要下载Lua和LuaDebug这2个扩展~
看到LuaDebug的作者actboy168,我有点惊讶,actboy168是大名鼎鼎的ydwe作者之一,在以前自己玩we的时候用的编辑器就是actboy168大佬的,后面听说支持lua来代替jass编写游戏逻辑(那时候已经弃坑~);好的,闲话不多说,我们来编写我们的第一个脚本。
创建一个空文件夹并用vscode打开
创建一个test.lua文件
编写一行代码 print("Hi,Lua~")(也可以使用'' 单引号)
基本使用
数据类型
在lua中和python类型可以直接声明并使用,无需使用类型名,lua自动分析数据类型。
lua的数据类型为(8个):
nil 空
boolean 布尔型
number 数字型
function 函数型
string 字符串型
userdata 用户自定义类型
thread 线程型
table 表型
可以使用type()来查看类型~
Ps:在lua中不强制使用;结尾
--lu ...










