[转]lua面向对象编程之点号与冒号的差异详细比较
首先,先来一段在lua创建一个类与对象的代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Class = {}Class.__index = Classfunction Class:new(x,y) local temp = {} setmetatable(temp, Class) temp.x = x temp.y = y return tempendfunction Class:test() print(self.x,self.y)endobject = Class.new(10,20)object:test() |
猜一下会输出什么结果呢?
输出:
>lua -e "io.stdout:setvbuf 'no'" "object.lua"
20 nil
>Exit code: 0
我们的y值怎么没了?
这个原因很简单,因为我们创建一个对象的时候使用了一个 . 号
在lua程序设计第二版中,有提到当一项操作所作用的”接受者”,需要一个额外的参数来表示该接受者,这个参数通常称为self或this
然后我们在这段代码加上 self
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Class = {}Class.__index = Classfunction Class:new(x,y) local temp = {} setmetatable(temp, Class) temp.x = x temp.y = y return tempendfunction Class:test() print(self.x,self.y)endobject = Class.new(self,10,20)object:test() |
然后我们在看一下输出
>lua -e "io.stdout:setvbuf 'no'" "object.lua"
10 20
>Exit code: 0
这下就正常了!!嗯,每次创建一个对象的时候都有写一个self,会不会感觉很麻烦呢?lua提供了用冒号的方式在一个方法定义中添加一个额外的参数,以及在一个方法调用中添加一个额外的实参
然后代码改成
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Class = {}Class.__index = Classfunction Class:new(x,y) local temp = {} setmetatable(temp, Class) temp.x = x temp.y = y return tempendfunction Class:test() print(self.x,self.y)endobject = Class:new(10,20)object:test() |
输出正常:
>lua -e "io.stdout:setvbuf 'no'" "object.lua"
10 20
>Exit code: 0
如果,就这么完的话,本来是一件很欢乐的事情,但是,我尝试了一下以下代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Class = {}Class.__index = Classfunction Class.new(x,y) local temp = {} setmetatable(temp, Class) temp.x = x temp.y = y return tempendfunction Class:test() print(self.x,self.y)endobject = Class.new(10,20)object:test() |
出乎意料的是:
>lua -e "io.stdout:setvbuf 'no'" "object.lua"
10 20
>Exit code: 0
代码正常运行….这个让人很费解,本来,点号对方法的操作是需要一个额外的接受者,第一段代码已经说明了这个问题,但是,现在程序有正常运行,令我真是有点费解…
然后,我接着尝试又发现
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Class = {}Class.__index = Classfunction Class.new(x,y) local temp = {} setmetatable(temp, Class) temp.x = x temp.y = y return tempendfunction Class:test() print(self.x,self.y)endobject = Class:new(10,20)object:test() |
输出结果:
>lua -e "io.stdout:setvbuf 'no'" "object.lua"
table: 003CACA0 10
>Exit code: 0
这个只不过跟第一段代码点号和冒号的位置调换了一下,就出现了这样的结果…
如果,你仔细想想,这里和第一段代码的区别,可以发现,其实,这里就可以证明了冒号其实就是默认传了一个实参到方法中
为了证明冒号的作用,我改动了一下代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Class = {}Class.__index = Classfunction Class:new(x,y) local temp = {} setmetatable(temp, Class) temp.x = x temp.y = y return tempendfunction Class.test() print(self.x,self.y)endobject = 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这个参数,竟然,方法用的是点号,那我们试一下把对象传进去看下能不能正常运行
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Class = {}Class.__index = Classfunction Class:new(x,y) local temp = {} setmetatable(temp, Class) temp.x = x temp.y = y return tempendfunction Class.test() print(self.x,self.y)endobject = 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
那我们这次尝试下想刚才那样,把方法的点号搞成一致看下效果怎样
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Class = {}Class.__index = Classfunction Class:new(x,y) local temp = {} setmetatable(temp, Class) temp.x = x temp.y = y return tempendfunction Class.test() print(self.x,self.y)endobject = Class:new(10,20)object.test() |
遗憾的是跟之前不一样,还是不能运行
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Class = {}Class.__index = Classfunction Class:new(x,y) local temp = {} setmetatable(temp, Class) temp.x = x temp.y = y return tempendfunction Class.test() print(self.x,self.y)endobject = Class:new(10,20)object.test() |
|
1
|
|
|
1
|
回想一下,冒号的作用可以传递一个实参,对于方法的操作我们需要一个接受者,那么进行以下的改动 |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Class = {}Class.__index = Classfunction Class:new(x,y) local temp = {} setmetatable(temp, Class) temp.x = x temp.y = y return tempendfunction Class:test() print(self.x,self.y)endobject = Class:new(10,20)object.test(object) |
这次输出就正常了
>lua -e "io.stdout:setvbuf 'no'" "object.lua"
10 20
>Exit code: 0
这段代码告诉了我们,想要操作一个方法就一定需要一个额外参数来表示该值,对于点号,我们必须显示传递一个实参,才能使程序正常运行,而为了方便,我们可以直接使用冒号来简化操作.
[转]lua面向对象编程之点号与冒号的差异详细比较的更多相关文章
- lua面向对象编程之点号与冒号的差异详细比较
首先,先来一段在lua创建一个类与对象的代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Class = {} Class.__index = Cl ...
- Lua中调用函数使用点号和冒号的区别
1.初学者最易混乱Top1——调用函数时用点号还是用冒号? 我们来看看下面的两句代码: mSprite.setPosition(, ); mSprite:setPosition(, ); 对于初次接触 ...
- 理解lua 语言中的点、冒号与self
转载自: http://blog.csdn.net/wangbin_jxust/article/details/12170233 lua编程中,经常遇到函数的定义和调用,有时候用点号调用,有时候用冒号 ...
- PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
这篇文章主要介绍了PHP面向对象编程之深入理解方法重载与方法覆盖(多态)的相关资料,需要的朋友可以参考下: 什么是多态? 多态(Polymorphism)按字面的意思就是"多种状态" ...
- 深入理解JavaScript系列(17):面向对象编程之概论
介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...
- python基础-面向对象编程之继承
面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...
- python基础-面向对象编程之封装、访问限制机制和property
面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...
- python基础-面向对象编程之反射
面向对象编程之反射 反射 定义:通过字符串对对象的属性和方法进行操作. 反射有4个方法,都是python内置的,分别是: hasattr(obj,name:str) 通过"字符串" ...
- python基础-面向对象编程之多态
面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...
随机推荐
- 华东交通大学2016年ACM“双基”程序设计竞赛 1008
Problem Description halfyarn找你写个简单的题?好哒!给你n个整数,现在要求你选择两个位置的数,例如选择第pos_a个数a,和第pos_b个数b,给定ans=min(a,b) ...
- [转]NPOI 单元格级别应用
原文地址:http://hi.baidu.com/linrao/item/fadf96dce8770753d63aaef2 HSSFWorkbook hssfworkbook = new HSSFWo ...
- 执行大量的Redis命令,担心效率问题?用Pipelining试试吧~
参考的优秀文章 Request/Response protocols and RTT 来源 原来,系统中一个树结构的数据来源是Redis,由于数据增多.业务复杂,查询速度并不快.究其原因,是单次查询的 ...
- 为linux系统添加虚拟内存swap分区
阿铭linux学习笔记之swap分区 一.作用: swap分区是交换分区,在系统物理内存不足时与swap进行交换,对web服务器的性能影响极大,通过调整swap分区大小来提升服务器的性能,节省资源费用 ...
- 后勤数据源增量队列Delta Queue(RSA7)中的增量更新区Delta Update、增量重复区Delta Repetition
声明:原创作品,转载时请注明文章来自SAP师太技术博客:( 博/客/园www.cnblogs.com)www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 【WEB】HTTP协议
http1.0和http1.1 区别,http1.1可以发送多个http请求
- InnoDB和MyISAM(转)
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持. 我作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,但是从我目前运维的数据库平台要达 ...
- python 线程学习
彩照 一.学习[1] # -*- coding: utf-8 -*- import time import thread def timer(no, interval): cnt = 0 while ...
- mysql简介
1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数 ...
- gcc -fvisibility=hidden,-fPIC选项
1. http://www.tuicool.com/articles/fy6Z3aQ 2. http://www.ibm.com/developerworks/cn/linux/l-cn-sdlsta ...