本文主要是介绍Lua面向对象编程之点与冒号的差异比较,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
从一段代码开始
代码 1-1:
Class = {}
-- Class.__index = Classfunction Class:new(x,y)local temp = {}setmetatable(temp, {__index = Class})-- setmetatable(temp, Class)temp.x = xtemp.y = yreturn temp
endfunction Class:test()print(self.x,self.y)
endobject = Class.new(10, 20)object:test()
备注部分 |
---|
Class.__index = Class |
(__index) 是metatable元方法。通过键来访问table的时候,如果这个键没有值,那么Lua就会寻找该table的metatable中的__index键。如果__index包含一个表格,Lua会在表格中查找相应的键。 |
同样在设置metatable的时候,设置作用相同。
上面的代码的输出结果:
20 nil
之所以会输出上面的结果,在于我们在创建对象的时候使用到 . 号
冒号本身是一个语法糖,当一个table内的方法被以冒号调用的话:表示把这个table作为第一个参数传递过去
使用 . 号,需要显示传递或者接收。
当一项所作用的“接收者”,需要一个额外的参数来表示该接收者,这个参数通常称为self 或 this,也就是使用 . 号对方法进行操作的时候需要一个额外的接收者
分析上面的代码的理解,我们使用 .new() 正确的传递参数为(self, 10, 20),然而我们只使用了两个参数(10, 20)。所以会输出上面的结果。
正确的代码结构
代码 1-2:
Class = {}
-- Class.__index = Classfunction Class:new(x,y)local temp = {}setmetatable(temp, {__index = Class})-- setmetatable(temp, Class)temp.x = xtemp.y = yreturn temp
endfunction Class:test()print(self.x,self.y)
endobject = Class.new(self, 10, 20)object:test()
输出结果:
10 20
既然讨论了逗号和冒号,如果把
object:test()
更改为
object.test()
那这样的输出结果是什么呢?
嘿嘿嘿 这样编译不通过~
根据上面的 . 号 分析,我们可以把table对象添加在参数中,然后函数就变成下面这个样子
代码 1-3:
Class = {}
-- Class.__index = Classfunction Class:new(x,y)local temp = {}setmetatable(temp, {__index = Class})-- setmetatable(temp, Class)temp.x = xtemp.y = yreturn temp
endfunction Class:test()print(self.x,self.y)
endobject = Class.new(self, 10, 20)object.test(object)
这段代码同样也是会正确输出结果的。
如果我们每次都要在参数里面添加self 进去,这样会觉得很繁琐。那就使用冒号个方式
代码 1-4:
Class = {}
-- Class.__index = Classfunction Class:new(x,y)local temp = {}setmetatable(temp, {__index = Class})-- setmetatable(temp, Class)temp.x = xtemp.y = yreturn temp
endfunction Class:test()print(self.x,self.y)
endobject = Class:new(10, 20)object:test()
这段代码同样会正常输出结果(可以自己测试看下结果)
当我们把函数更改成下面这种格式的时候:
代码 1-5:
Class = {}function Class.new(x,y)local temp = {}setmetatable(temp, {__index = Class})temp.x = xtemp.y = yreturn temp
endfunction Class:test()print(self.x,self.y)
endobject = Class.new(10, 20)object:test()
输出结果为:
10 20
如果按照之前的介绍,你可能认为这个输出错了。其实不然
当我们把函数定义为
function Class.new(x, y)
end
这种格式的时候,默认不会接受self参数。
如果把代码里面更改
function Class.test()print(self.x,self.y)
end
就会报错,因为这里使用到self,找不到全局变量self。
如果又想使用这种定义的话,只能显示的定义参数了,重新定义的代码结构为:
代码 1-6:
Class = {}function Class.new(x,y)local temp = {}setmetatable(temp, {__index = Class})temp.x = xtemp.y = yreturn temp
endfunction Class.test(self)print(self.x,self.y)
endobject = Class.new(10, 20)object.test(object)
-- object:test()
最后一行注释的方法相信很容易看懂了吧,关于 . 号和冒号之间的区别大致就只有这些了。
如有不正之处,望指正。
参考链接:
- http://www.cnblogs.com/youxilua/archive/2011/07/28/2119059.html
Shanghai - YR - 2016年11月14日
这篇关于Lua面向对象编程之点与冒号的差异比较的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!