冒号的作用:
1、定义函数时,给函数添加隐藏的第一个参数 self
2、调用函数时,默认把当前调用者作为第一个参数传递进去
如 a:b(c) 可以理解为 a.b(a, c)
以下是用点号的定义和调用函数的方式:
1 Song = 2 { 3 name = "", 4 timeLength = 0, 5 } 6 7 function Song.SetName(name) 8 Song.name = name; 9 end
以上的函数定义可以使可以,但是有一个很大的问题,思考10s为什么?
假如有以下逻辑:
1 ChineseSong = Song; 2 Song = nil; 3 ChineseSong.SetName("化身孤岛的鲸");
赋值操作使两者指向了相同的内存地址。这样显然是编译通不过的,因为方法中用到了 Song,但是Song此时为 nil。
以下是修改后的代码:
1 Song = 2 { 3 name = "", 4 age = 0, 5 } 6 7 function Song.SetName(self, name) 8 self.name = name; 9 end 10 local ChineseSong = Song; 11 Song = nil; 12 ChineseSong.SetName(ChineseSong, "化身孤岛的鲸"); 13 print(ChineseSong.name)
运行结果:
使用冒号可以简化函数的定义与调用,代码如下:
1 Song = 2 { 3 name = "", 4 age = 0, 5 } 6 7 function Song:SetName(name) 8 self.name = name; 9 end 10 11 local ChineseSong = Song; 12 Song = nil; 13 ChineseSong:SetName("化身孤岛的鲸"); 14 print(ChineseSong.name);
运行结果: