lua类踩坑

第一天入职游戏公司,主管让我学习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表的强大功能真是震撼到我

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值