Lua你不得不学的干货
Posted 爱上游戏开发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua你不得不学的干货相关的知识,希望对你有一定的参考价值。
Lua中成员函数的定义应该约定一种形式而不要点和冒号同时使用
在lua中面向对象编程的时候都要用冒号
使用冒号声明函数的时候会把self作为参数隐藏在里面,如果这个时候用点就会报错
-- 基础类方法 new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
self.perimeter = side*4;
return o
end
-- 基础类方法 printArea
function Shape:printArea ()
print("面积为 :",self.area)
end
-- 基础类方法 perimeter
function Shape:printperimeter ()
print("面积为 :",self.perimeter)
end
-- 创建对象
myshape = Shape:new(nil,10)
myshape:printArea();
myshape:printperimeter();
---------------------------------------
面积为 :100
周长为 :40
[Finished in 0.1s]
访问属性和成员函数
我们可以使用点号(.)来访问类的属性;我们可以使用冒号 : 来访问类的成员函数
myshape = Shape:new(nil,10)
myshape:printArea();
myshape:printperimeter();
print(myshape.area)
----------------------------
面积为 :100
周长 :40
100
[Finished in 0.1s]
定义成员函数
Lua在函数定义时可以用点也可以用冒号
1.冒号声明并调用
mytable ={a=2,b=3}
function mytable:Add(p)
print(self)
print(self.a)
print(p)
end
mytable:Add(5)
-----------------------
table: 0035B850
2
5
[Finished in 0.1s]
如果用冒号声明的函数用点来调用 mytable.Add(5) 就会报错或者出现self为nil的结果; 如果我们用点调用的话就需要传入一个参数来充当self的角色
mytable ={a=2,b=3}
function mytable:Add(p)
print(self)
print(self.a)
print(p)
end
mytable.Add(mytable,5)
-----------
table: 0075B850
2
5
[Finished in 0.1s]
2.点声明并调用
function mytable.Subtract(m,n)
mytable:Subtract(7,10)
------------------------
table: 009BB8A0
7
[Finished in 0.1s]
总结
1.冒号定义成员函数相比点定义可以减少一个需要传入自身的参数,内部用self来访问自身;
2.点调用冒号定义的函数时,需要多传入一个参数,传入的第二个参数开始才对应于原函数的参数列表,函数内部用到的self则变为对应于传入的第一个参数的普通变量,故传入的第一个参数应该当是调用者自身(当然如果函数内部并没有用到self则第一个参数随便传个什么都行);
3.冒号调用点定义的函数时,原函数的第一个参数强制变为等同于self的变量,传入的参数从原参数的第二个参数开始才能一一对应上,因此通常这样调用都是会出错的(除非函数内部原本就把第一个参数在当self用...)。
Lua中成员函数的定义应该约定一种形式而不要点和冒号同时使用,不然调用者可能会不清楚该函数是否支持另一种方式的调用而增加出错的可能。
-- END --
▽想深入了解么?
长按/扫码关注我吧↑↑↑
觉得不错就点个在看吧!
以上是关于Lua你不得不学的干货的主要内容,如果未能解决你的问题,请参考以下文章
技术干货听阿里云CDN安防技术专家金九讲tengine+lua开发