欢迎来到我的博客小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

Lua中点和冒号的区别

  |   0 评论   |   0 浏览

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)

如果用冒号调用点声明的函数:结果第一个不是我们传入的参数m=7,而是一个table,而第二个才是我们传入的参数7;
冒号调用以点定义的函数时,函数的参数的意义发生了变化,第一个参数强制变为了表示自身的变量(此时的m等同于self),

mytable:Subtract(7,10)
------------------------
table: 009BB8A0
7
[Finished in 0.1s]

综上:

1.冒号定义成员函数相比点定义可以减少一个需要传入自身的参数,内部用self来访问自身;

2.点调用冒号定义的函数时,需要多传入一个参数,传入的第二个参数开始才对应于原函数的参数列表,函数内部用到的self则变为对应于传入的第一个参数的普通变量,故传入的第一个参数应该当是调用者自身(当然如果函数内部并没有用到self则第一个参数随便传个什么都行);

3.冒号调用点定义的函数时,原函数的第一个参数强制变为等同于self的变量,传入的参数从原参数的第二个参数开始才能一一对应上,因此通常这样调用都是会出错的(除非函数内部原本就把第一个参数在当self用...)。

Lua中成员函数的定义应该约定一种形式而不要点和冒号同时使用,不然调用者可能会不清楚该函数是否支持另一种方式的调用而增加出错的可能。


标题:Lua中点和冒号的区别
作者:shirlnGame
地址:https://www.mmzsblog.cn/articles/2020/12/19/1608359938560.html
-----------------------------
如未加特殊说明,此网站文章均为原创。
网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜爱上游戏开发