首先,先来一段在lua创建一个与对象的代码

Class = {}
Class.__index = Class
function Class:new(x,y)
local temp = {}
setmetatable(temp, Class)
temp.x = x
temp.y = y
return temp
end
function Class:test()
print(self.x,self.y)
end
object = Class.new(10,20)
object:test()

猜一下会输出什么结果呢?

输出:

>lua -e "io.stdout:setvbuf 'no'" "object.lua"
20    nil
>Exit code: 0

我们的y值怎么没了?

这个原因很简单,因为我们创建一个对象的时候使用了一个 . 号

lua程序设计第二版中,有提到当一项操作所作用的”接受者”,需要一个额外的参数来表示该接受者,这个参数通常称为self或this

然后我们在这段代码加上 self

Class = {}
Class.__index = Class
function Class:new(x,y)
local temp = {}
setmetatable(temp, Class)
temp.x = x
temp.y = y
return temp
end
function Class:test()
print(self.x,self.y)
end
object = Class.new(self,10,20)
object:test()

然后我们在看一下输出

>lua -e "io.stdout:setvbuf 'no'" "object.lua"
10    20
>Exit code: 0

这下就正常了!!嗯,每次创建一个对象的时候都有写一个self,会不会感觉很麻烦呢?lua提供了用冒号的方式在一个方法定义中添加一个额外的参数,以及在一个方法调用中添加一个额外的实参

然后代码改成

Class = {}
Class.__index = Class
function Class:new(x,y)
local temp = {}
setmetatable(temp, Class)
temp.x = x
temp.y = y
return temp
end
function Class:test()
print(self.x,self.y)
end
object = Class:new(10,20)
object:test()

输出正常:

>lua -e "io.stdout:setvbuf 'no'" "object.lua"
10    20
>Exit code: 0

如果,就这么完的话,本来是一件很欢乐的事情,但是,我尝试了一下以下代码

Class = {}
Class.__index = Class
function Class.new(x,y)
local temp = {}
setmetatable(temp, Class)
temp.x = x
temp.y = y
return temp
end
function Class:test()
print(self.x,self.y)
end
object = Class.new(10,20)
object:test()

出乎意料的是:

>lua -e "io.stdout:setvbuf 'no'" "object.lua"
10    20
>Exit code: 0

代码正常运行….这个让人很费解,本来,号对方法的操作是需要一个额外的接受者,第一段代码已经说明了这个问题,但是,现在程序有正常运行,令我真是有费解…

然后,我接着尝试又发现

Class = {}
Class.__index = Class
function Class.new(x,y)
local temp = {}
setmetatable(temp, Class)
temp.x = x
temp.y = y
return temp
end
function Class:test()
print(self.x,self.y)
end
object = Class:new(10,20)
object:test()

输出结果:

>lua -e "io.stdout:setvbuf 'no'" "object.lua"
table: 003CACA0    10
>Exit code: 0

这个只不过跟第一段代码和冒号的位置调换了一下,就出现了这样的结果…

如果,你仔细想想,这里第一段代码的区别,可以发现,其实,这里就可以证明了冒号其实就是默认传了一个实参到方法中

为了证明冒号的作用,我改动了一下代码

Class = {}
Class.__index = Class
function Class:new(x,y)
local temp = {}
setmetatable(temp, Class)
temp.x = x
temp.y = y
return temp
end
function Class.test()
print(self.x,self.y)
end
object = Class:new(10,20)
object:test()

输出的结果是:

>lua -e "io.stdout:setvbuf 'no'" "object.lua"
lua: object.lua:15: attempt to index global 'self' (a nil value)
stack traceback:
    object.lua:15: in function 'test'
    object.lua:21: in main chunk
    [C]: ?
>Exit code: 1

从这里的错误可以看出,没有self这个参数,竟然,方法用的是号,那我们试一下把对象传进去看下能不能正常运行

Class = {}
Class.__index = Class
function Class:new(x,y)
local temp = {}
setmetatable(temp, Class)
temp.x = x
temp.y = y
return temp
end
function Class.test()
print(self.x,self.y)
end
object = Class:new(10,20)
object:test(object)

遗憾的是这样的改动是错误的,错误的结果也是一样的

>lua -e "io.stdout:setvbuf 'no'" "object.lua"
lua: object.lua:15: attempt to index global 'self' (a nil value)
stack traceback:
    object.lua:15: in function 'test'
    object.lua:21: in main chunk
    [C]: ?
>Exit code: 1

那我们这次尝试下想刚才那样,把方法的号搞成一致看下效果怎样

Class = {}
Class.__index = Class
function Class:new(x,y)
local temp = {}
setmetatable(temp, Class)
temp.x = x
temp.y = y
return temp
end
function Class.test()
print(self.x,self.y)
end
object = Class:new(10,20)
object.test()

遗憾的是跟之前不一样,还是不能运行

Class = {}
Class.__index = Class
function Class:new(x,y)
local temp = {}
setmetatable(temp, Class)
temp.x = x
temp.y = y
return temp
end
function Class.test()
print(self.x,self.y)
end
object = Class:new(10,20)
object.test()
 
回想一下,冒号的作用可以传递一个实参,对于方法的操作我们需要一个接受者,那么进行以下的改动
Class = {}
Class.__index = Class
function Class:new(x,y)
local temp = {}
setmetatable(temp, Class)
temp.x = x
temp.y = y
return temp
end
function Class:test()
print(self.x,self.y)
end
object = Class:new(10,20)
object.test(object)

这次输出就正常了

>lua -e "io.stdout:setvbuf 'no'" "object.lua"
10    20
>Exit code: 0

这段代码告诉了我们,想要操作一个方法就一定需要一个额外参数来表示该值,对于号,我们必须显示传递一个实参,才能使程序正常运行,而为了方便,我们可以直接使用冒号来简化操作.

结论:

罗嗦了半天其实,可以用一下一句话来避免这个问题:

lua进行面向对象的编程,声明方法调用方法统一用冒号,对于属性的调用全部用

搞这么多其实,只是加深理解罢了…欢迎交流批评..

lua面向对象编程之点号与冒号的差异详细比较相关推荐

  1. 关于lua中的点号与冒号的区别与使用

    关于lua中的点号与冒号的区别与使用 如果函数定义使用冒号,则默认会接受self参数,其调用时会传递调用它本身作为参数,而使用点号则不会. // 点号和冒号的用法 class={} function ...

  2. Lua中使用点号与冒号的区别

    Lua中使用点号(.)与冒号(:)的区别在于: 在函数定义的时候使用:会默认接收self参数: 在函数调用的时候使用:会默认传递调用者自己为参数: 在函数定义和调用的时候使用.则需要显式接收或者传递s ...

  3. Lua 语言中的点、冒号与self

    lua编程中,经常遇到函数的定义和调用,有时候用点号调用,有时候用冒号调用,这里简单的说明一下原理. girl = {money = 200} function girl.goToMarket(gir ...

  4. C/C++面向对象编程之多态

    C/C++面向对象编程 目录: 1.类型转换 2.为什么引入多态和虚函数 3.编译器如何实现多态和虚函数 4.多态的思想 5.C语言用实现多态的思想 目录: C/C++面向对象编程之封装 C/C++面 ...

  5. 【C语言】C语言实现面向对象编程之封装

    00. 目录 文章目录 00. 目录 01. 前言 02. 简单程序示例 03. 程序示例优化 04. 总结 05. 参考 01. 前言 面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种 ...

  6. python面向对象编程之实例属性和类属性

    廖雪峰python教程 面向对象编程之实例属性和类属性 练习 为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加: # -*- coding: utf-8 -*- ...

  7. python面向对象编程之访问限制

    廖雪峰python教程 面向对象编程之访问限制 https://www.liaoxuefeng.com/wiki/1016959663602400/1017496679217440 练习: 请把下面的 ...

  8. python面向对象编程指南 脚本之家_Python面向对象编程之继承与多态详解

    本文实例讲述了Python面向对象编程之继承与多态.分享给大家供大家参考,具体如下: Python 类的继承 在OOP(Object Oriented Programming)程序设计中,当我们定义一 ...

  9. 【历史上的今天】5 月 17 日:面向对象编程之父出生;国内全面接入互联网;惠普收购 Cray

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 5 月 17 日,在 1969 年的今天,国际电信联盟第二十四届行政理事会正式通过决议,决定把国际电 ...

最新文章

  1. python病毒扫描器_基于Python的病毒扫描机制
  2. python 3.5-安装python3.5
  3. 使用html5 Geolocation显示你的地理位置
  4. 图书网上商城blog
  5. 16张扎心漫画,戳中女生私密日常,每一幕都很真实
  6. 1.0jpa 2.0_EasyCriteria 2.0 – JPA标准应该很容易
  7. RuntimeError: DataLoader worker (pid(s) 13512, 280, 21040) exited unexpectedly
  8. 关于计算机软件技术基础知识,计算机软件技术基础知识要点.doc
  9. Virtual.Lab模拟钢板冲击声
  10. erlang的epmd指定端口范围验证及端口权限配置
  11. 从文件夹内批量获取所有文件名 批处理脚本
  12. datagridview 筛选_【Excel】如何用通配符快速筛选到所需信息
  13. 汇编语言与计算机体系结构
  14. jenkins插件之Publish Over SSH
  15. TeamWork#3,Week5,The First Meeting of Our Team
  16. 计算机在施工中的应用研究,浅析计算机技术及网络在工程施工中的应用研究.pdf...
  17. 解决Xcode 9.x 没有代码提示
  18. docx 2003 的补丁
  19. Oracle数字转汉字过程,oracle中如何将字符和数字转成中文
  20. 玩转“数独”2.0时代

热门文章

  1. 网络编程模型综述 之 UNIX网络I/O模型
  2. WinCE驱动开发问题精华集锦
  3. jmeter找不到java_Windows下Jmeter安装出现Not able to find Java executable or version问题解决方案...
  4. python某公司为员工发放奖品_python 练习2
  5. UML类图五种关系与代码的对应关系
  6. 【转】Ubuntu16.04安装 Matlab2018a详细教程
  7. SparkStreaming - 自定义数据源(自定义采集器)
  8. REVERSE-PRACTICE-BUUCTF-17
  9. 【POJ - 1050】To the Max (dp)
  10. 【PTA天梯赛CCCC -2017决赛L2-3】图着色问题 (25 分)(图染色)