本课首先声明,本课用到了中文键的方式展开
虽然lua官方并没有支持中文,如果你精通JAVA或者c#,可自行进行更简单的方式书写,本课文用纯lua书写配置
精通lua的估计盒子里没几个,毕竟精通都去找工作去了,谁还闲着没事去去看帖子![[吐舌]](/public/face/f03.png)
正式进入教程
首先,我们需要了解到一个lua有一种东西叫闭包![[呵呵]](/public/face/f01.png)
我们先了解到他的第一个特性--第一类值!
什么意思?
见图片①代码
如果没接触到gg库,只学过标准lua,可把gg.searchNumber改成打印函数print
其中的原理就是每一个函数(尤其库函数,当然,有一些软件构造上也不全都如下所说,但是库函数基本是一定的),它都是具有匿名性的,
拿print来说,你可以把它想成两个部分,一个叫做名字,一个叫做功能,他把打印功能的名字叫做print。现在用一个变量进行一个对其赋值,就是把它的功能赋值给这个变量,他的名字就是这个变量名(可以这么理解)
那么我们再来接触表,学过lua的都应该知道表与键,现在我们用中文键当做索引,见图片②代码
这里我们看到带着英文名的表,用中文键"打印"可以与print相同的功能
那么我们再来延伸
我们知道当函数的括号里面只有一个字符串或者一个表的时候,他是可以不加最外面那层括号的
那么现在我们来赋予它一种新的写法,见图片③
这里我们看到,代码相当于一个表中表,是不是有一点套娃的想法,代码当中的print可以重新给它赋值,给一个变量名,然后用那个变量名书写
记住,一定要以下格式进行书写图片③中新写法
表键=function ()
.......
end
因为前面我们说到过名字和功能分开,按照常规语言来说,像这种操作是不允许的,因为lua函数具有"匿名性"的特点,什么意思呢?你就把所有函数都当成在一个表当中,所有的函数名当做一个索引,这个样子你就能大概理解了,然后我们把这个索引赋值给其他变量,其他变量就有了应用这个功能的入口
但是肯定会有人说,这种还不能算是真正的仿中文
我们怎么样把前面的表英文字母去掉?
我要讲的真正的难题来了
把表前面的英文字母去掉,这个表就是一个匿名的表,在这个匿名的表当中通过索引运用功能,举一个形象的例子
在茫茫人海当中,不知道你的名字不认识你,但我能准确找到你
像这种问题,C语言给出了初始化时就使用匿名表,大多语言也都是这个样子,因为不太初始化时使用,就会造成无法找到这个匿名表入口,这可以说是一个很大的难题了
那么lua可以吗!!!既然我说了,那就一定可以。
首先看图片④代码
这里我们惊恐地看到,英文表名居然可以去了!
这是什么原理呢?这里其实用到了继承与元方法
为什么用了setmetatable这个函数就能访问了?
在解答这个疑问之前,我们先来了解__index元方法
因为本课只讲这个元方法,其他元方法不会讲,可以上网查资料了解更多详细
__index可以链接起两个表(这里或许讲的不是很正规,但是非常形象的形容),什么意思呢?我们来看表的本质
一个表的当中,假如你访问一个不存在的键,他确实会先在一个表当中去找这个索引键,但假如没找到的话,它实际上会访问一个叫__index的元方法,假如这个元方法也没有,就会返回nil(空)
那么反之,就会由这个元方法提供这个索引键
那么,在图片④当中,我们设置了一个元表a
什么是元表?他在没用setmetatable函数时,就是一个普通的表,用完此函数之后,我说他叫元表,他就叫元表,将这个元表a与匿名表链接,
(setmetatable函数,他就是用来进行一个继承的函数,在本文中,可以说加两个表链接起来,)
也就是说,提供一个索引键,在匿名表中是肯定不会有的,那他就会去查找元表a里的键,然后再对其功能进行运用
但是这样有一个很大的缺陷,就是你必须写一次setmetatable函数,才能用"一次"匿名中文键这就造成了极大的不方便,所以我依然想到用继承方法,所以最好的方法还是不去脱离表名,但是我们通过这个可以给他任意取名,见图片⑤,具体详细可以去加鹅群
码字不易,纯本人思路,未参考任何资料,点个赞吧





举报 0