lua学习2

之前一节的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值