第一天入职游戏公司,主管让我学习lua,大部分时间都花在解决面向对象编程和安装lua与C交互的环境了
作为程序员没有自己的技术日志怎么行,今天就来吐槽一下lua学习时候采的坑
-- Meta class
Shape = {area = 0}
-- 基础类方法 new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- 基础类方法 printArea
function Shape:printArea ()
print("面积为 ",self.area)
end
-- 创建对象
myshape = Shape:new(nil,10)
myshape:printArea()
Square = Shape:new()
-- 派生类方法 new
function Square:new (o,side)
o = o or Shape:new(o,side)
setmetatable(o, self)
self.__index = self
return o
end
-- 派生类方法 printArea
function Square:printArea ()
print("正方形面积为 ",self.area)
end
-- 创建对象
mysquare = Square:new(nil,10)
mysquare:printArea()
Rectangle = Shape:new()
-- 派生类方法 new
function Rectangle:new (o,length,breadth)
o = o or Shape:new(o)
setmetatable(o, self)
self.__index = self
self.area = length * breadth
return o
end
-- 派生类方法 printArea
function Rectangle:printArea ()
print("矩形面积为 ",self.area)
end
-- 创建对象
myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()
这是菜鸟教程上的,一开始看见那么多self我也是懵逼,然后主管给我的题上是要在lua上用链表实现栈,于是我写了一段:
LinkNode = {value=0,pNext=nil}
function LinkNode:new(o,val)
o = o or {}
setmetatable(o,self)
self.__index=self
self.value=val
self.pNext=nil
return o
end
function LinkNode:addback(parent)
self.pNext=parent.pNext
parent.pNext=self
return self
end
然后加入函数代码,测试
linknode = LinkNode:new(0)
for i=1,5 do
local node=LinkNode:new(i)
node:addback(linknode)
end
local l=linknode
for i=1,5 do
print(l.pNext.value)
l=l.pNext
end
结果就是不行,就输出5个5,我想怎么和教程一模一样还不对呢?于是浪费了一下午的时间修复这个问题。
多亏有带我的师父给我改成
function LinkNode:new(o,val)
o = o or {}
setmetatable(o,self)
self.__index=self
o.value=val
o.pNext=nil
return o
end
再运行,行了!成功输出54321。师父居然说是教程错了,我简直不敢相信……
其实双点是lua中的语法糖,LinkNode:new(o,val)完全等同于LinkNode.new(self,o,val)
而这个self就是LinkNode,元类本体
我每次实例化一个LinkNode,其实修改的并不是新实例化出的LinkNode的value值,而是修改的元类本体的value值,每实例化一次,就拿
新的值覆盖旧的值……所以最后会输出5个5
但是如果将其改成o,o本身为空但是会根据元表继承LinkNode中的value变量,所以实例化时修改的就是o的value值。
原来教程中之所以不会出BUG,是因为它实例化输出的步骤是实例化一个输出一个,再实例化一个再输出,相当于
i=1
print(i)
i=2
print(i)
而我的是直接实例化5个,再输出5个,相当于
i=1
i=2
print(i)
print(i)
吐槽下菜鸟教程,误人子弟,让本萌新踩了个大坑
另外,没想到表也能作为表的键值对里的键,没错是键,键值都可以,lua表的强大功能真是震撼到我
lua类踩坑
最新推荐文章于 2024-05-28 16:09:00 发布