之前一节的lua环境的安装参考:https://blog.csdn.net/wodownload2/article/details/84062588
网页学习网址:https://www.runoob.com/lua/lua-data-types.html
视频学习网址:https://www.bilibili.com/video/av48495302?p=3
本节学习内容:
命令行-i方式执行lua文件;
dofile的方式执行lua文件;
lua中的注释;
第1:命令行-i方式执行lua文件
首先学会的是命令行的交互方法:

hello2.lua的内容:
function cal(n)
if n== 0 then
return 1;
else
return n * cal(n-1);
end
end
print("enter a number:");
a = io.read("*number")
print(cal(a));
使用scite直接运行:

第2:dofile的方式执行lua文件

首先路径得保证正确。
第3:lua中的注释
单行注释:–your code
多行注释:–[[your code]]
第4:lua中的类型

还有两个数据类型:userdata和thread
第5:table
__index元方法——用于查询
__newIndex元方法
具有默认值的table
跟踪table的访问
只读的table
分别解释:__index方法,用来查询
window = {}
window.prototype = {x=0,y=0,width=100,height=100}
window.mt = {}
--[[window.mt.__index=function(table, key) --这种方式是一个函数
return window.prototype[key]
end]]
window.mt.__index = window.prototype --这种方式是一个表
function window.new(o)
setmetatable(o, window.mt)
return o
end
w = window.new({x=10,y=20})
print(w.width)
补充说明:
window是一个表;window.mt是一个表;
window有个new方法;new方法将对外来的表设置window.mt作为元表;
这里涉及到3个表;一个window基础表;一个元表;一个是新创建出来的表。
这个破烂不堪的例子,我还是留着。
第6:__index方法

看到虽然设置了mt作为t的元表,但是输出t.name依然为nil。
改为:

在调用print(t.name)的时候,触发了元表的__index方法,输出了hello world;最后t.name为nil。
再改为:

此时mt的__index方法为表,并且为自身,而自身有name,所以输出了xiaoming。
总结:
1、如果t表有key,则返回这个key对应的value。
2、否则,看看是否有元表,如果有元表,再看元表的__index方法,是啥?
3、如果__index对应的是函数,则直接执行这个函数。
4、如果__index对应的是表,则到这个表进行查找key对应的value,并且重复123
再次举例:

mt为t的元表,mt的__index对应的是表k,而k里有name,所以输出xiaoming。
再次举例:

mt为t的元表;mt2为k的元表;
查找t.name,则看mt的__index是啥,一看为k;这继续查找k里面是否有name属性,没有;
再看k有元表mt2,而mt2的__index为function,所以直接执行此函数,并且返回,最后t.name为nil。
第7:__newindex方法

解释,mt为t的元表,对t的a赋值,由于t没有a属性,则调用元表的__newindex,而__newindex对应方法,所以直接调用方法。
再举例:

mt为t的元表,对t的a赋值,发现t不存在a属性,于是调用__index方法,结果__index对应函数,在函数中执行了table.k = v,又再次递归调用mt的__newindex方法,出现栈溢出错误。如果就是想对t增加一个属性咋办,方法如下:

rawset(table,k,v)方法就是对table进行赋值k=v,不会再触发执行__newindex方法。
再举例:

mt为t的元表,mt的__newindex为表values,所以对t.a=1赋值,最后加入的是values中去了,而没有在t中。所以t.a为nil,values.a为1。
参考网址:https://blog.csdn.net/Running_Guy/article/details/73291913
1437

被折叠的 条评论
为什么被折叠?



