天天看点

【Lua编程基础】实测Lua中点和冒号的区别

欢迎加入Unity业内qq交流群:956187480

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)
  print(m)
  print(n)
end

mytable.Subtract(7,10)

---------------
7
10
[Finished in 0.1s]      

如果用冒号调用点声明的函数:结果第一个不是我们传入的参数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用...)。