lua面向对象编程之点号与冒号的差异详细比较
首先,先来一段在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面向对象编程之点号与冒号的差异详细比较相关推荐
- 关于lua中的点号与冒号的区别与使用
关于lua中的点号与冒号的区别与使用 如果函数定义使用冒号,则默认会接受self参数,其调用时会传递调用它本身作为参数,而使用点号则不会. // 点号和冒号的用法 class={} function ...
- Lua中使用点号与冒号的区别
Lua中使用点号(.)与冒号(:)的区别在于: 在函数定义的时候使用:会默认接收self参数: 在函数调用的时候使用:会默认传递调用者自己为参数: 在函数定义和调用的时候使用.则需要显式接收或者传递s ...
- Lua 语言中的点、冒号与self
lua编程中,经常遇到函数的定义和调用,有时候用点号调用,有时候用冒号调用,这里简单的说明一下原理. girl = {money = 200} function girl.goToMarket(gir ...
- C/C++面向对象编程之多态
C/C++面向对象编程 目录: 1.类型转换 2.为什么引入多态和虚函数 3.编译器如何实现多态和虚函数 4.多态的思想 5.C语言用实现多态的思想 目录: C/C++面向对象编程之封装 C/C++面 ...
- 【C语言】C语言实现面向对象编程之封装
00. 目录 文章目录 00. 目录 01. 前言 02. 简单程序示例 03. 程序示例优化 04. 总结 05. 参考 01. 前言 面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种 ...
- python面向对象编程之实例属性和类属性
廖雪峰python教程 面向对象编程之实例属性和类属性 练习 为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加: # -*- coding: utf-8 -*- ...
- python面向对象编程之访问限制
廖雪峰python教程 面向对象编程之访问限制 https://www.liaoxuefeng.com/wiki/1016959663602400/1017496679217440 练习: 请把下面的 ...
- python面向对象编程指南 脚本之家_Python面向对象编程之继承与多态详解
本文实例讲述了Python面向对象编程之继承与多态.分享给大家供大家参考,具体如下: Python 类的继承 在OOP(Object Oriented Programming)程序设计中,当我们定义一 ...
- 【历史上的今天】5 月 17 日:面向对象编程之父出生;国内全面接入互联网;惠普收购 Cray
整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 5 月 17 日,在 1969 年的今天,国际电信联盟第二十四届行政理事会正式通过决议,决定把国际电 ...
最新文章
- python病毒扫描器_基于Python的病毒扫描机制
- python 3.5-安装python3.5
- 使用html5 Geolocation显示你的地理位置
- 图书网上商城blog
- 16张扎心漫画,戳中女生私密日常,每一幕都很真实
- 1.0jpa 2.0_EasyCriteria 2.0 – JPA标准应该很容易
- RuntimeError: DataLoader worker (pid(s) 13512, 280, 21040) exited unexpectedly
- 关于计算机软件技术基础知识,计算机软件技术基础知识要点.doc
- Virtual.Lab模拟钢板冲击声
- erlang的epmd指定端口范围验证及端口权限配置
- 从文件夹内批量获取所有文件名 批处理脚本
- datagridview 筛选_【Excel】如何用通配符快速筛选到所需信息
- 汇编语言与计算机体系结构
- jenkins插件之Publish Over SSH
- TeamWork#3,Week5,The First Meeting of Our Team
- 计算机在施工中的应用研究,浅析计算机技术及网络在工程施工中的应用研究.pdf...
- 解决Xcode 9.x 没有代码提示
- docx 2003 的补丁
- Oracle数字转汉字过程,oracle中如何将字符和数字转成中文
- 玩转“数独”2.0时代
热门文章
- 网络编程模型综述 之 UNIX网络I/O模型
- WinCE驱动开发问题精华集锦
- jmeter找不到java_Windows下Jmeter安装出现Not able to find Java executable or version问题解决方案...
- python某公司为员工发放奖品_python 练习2
- UML类图五种关系与代码的对应关系
- 【转】Ubuntu16.04安装 Matlab2018a详细教程
- SparkStreaming - 自定义数据源(自定义采集器)
- REVERSE-PRACTICE-BUUCTF-17
- 【POJ - 1050】To the Max (dp)
- 【PTA天梯赛CCCC -2017决赛L2-3】图着色问题 (25 分)(图染色)