lua中self的意义
最近在用合宙的Air302开发物联网项目,因为合宙用的自家的luatOS操作系统,二次开发全都要用lua写,据说lua写起代码比C更方便,但是不会就是不会啊喂!!学不会就是不方便啊,例如这个self理解起来就有点困难。
lua中的数据类型
lua中一共有8种基本的数据类型,而且变量不需要类型定义,也就是不需要类型的声明。只需要为变量赋值。值可以存储在变量中,作为参数传递或结果返回。
| 数据类型 | 描述 |
| nil | 表示一个无效值(在条件表达式中相当于false)。 |
| boolean | 包含两个值:false和true |
| number | 表示双精度类型的实浮点数 |
| string | 字符串由一对双引号或单引号来表示 |
| function | 由C或lua编写的函数 |
| userdata | 表示任意存储在变量中的C数据结构 |
| thread | 表示执行独立线路,用于执行协同程序 |
| table | lua中的表(table)其实是一个“关联数组”,数组的索引可以是数字、字符串或表类型。在lua中,table的创建是通过“构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。 |
以上数据类型资料摘自RUNOOB网。
self表示的变量类型
从数据类型表可以看出来lua没有指针类,所以猜测self应该不是一个指针,这和C++中的this指针还是有区别的。这里我是将它理解成一个表的复制。也就是本身。
self的用法
这里解释一下有关函数的定义方式,lua中函数的定义可以有两种方式。
一种是
function MainScene:onCreate()
另一种是
function MainScene.onCreate(self)
上面两种定义方式是等价的,因此用冒号定义函数时,会给函数添加隐藏的第一个参数self,调用函数时,默认把当前调用者作为第一个参数传递进去。
1. 下面展示不同的定义函数方式
shape = {side = 4}
function shape.set_side(shape, side)
shape.side = side
end
function shape.prit_area(shape)
print(shape.side * shape.side)
end
print(shape.side)
shape.set_side(shape, 5)
print(shape.side)
shape.print_area(shape)
运行结果为:
2. 上面是用.来定义和访问函数的方法。下面用:来实现同样功能的改写。
shape = {side = 4}
function shape:set_side(side)
self.side = side
end
function shape:print_area()
print(self.side * self.side)
end
print(shape.side)
shape:set_side(5)
print(shape.side)
shape:print_area()
运行结果
上面的两个例子我们可以看出:冒号定义和冒号调用其实跟上面的效果一样,只是把第一个隐藏参数省略了。而self则是只想调用者自身。
3. 当然,我们也可以用点号.来定义函数,而用冒号:来调用函数。或者冒号定义点号调用。如下:
shape = {side = 4}
function shape.set_side(shape, side)
shape.side = side
end
function shape.print_area(shape)
print(shape.side * shape.side)
end
print(shape.side)
shape:set_side(5)
print(shape.side)
shape:print_area()
4. 或者
shape = {side = 4}
function shape:set_side(side)
self.side = side
end
function shape:print_area()
print(self.side * self.side)
end
print(shape.side)
shape.set_side(shape, 5)
print(shape.side)
shape.print_area(shape)
上述运行结果:

lua中self的意义的更多相关文章
- lua中得栈
如果你看了LUA的文档,那么就应该很清楚LUA与C交互数据时都是用到LUA中所谓的stack.那么当我调用lua_open函数之后栈是什么样的呢?空的(luaopen_base等会往栈上加进一些东西) ...
- ulua c#调用lua中模拟的类成员函数
项目使用ulua,我神烦这个东西.lua单纯在lua环境使用还好,一旦要跟外界交互,各种月经不调就来了.要记住贼多的细节,你才能稍微处理好.一个破栈,pop来push去,位置一会在-1,一会在-3,2 ...
- Lua中的模块与包
[前言] 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个 ...
- Lua中的一些库(1)
[数学库] 数学库(math)由一组标准的数学函数构成.这里主要介绍几个常用的函数,其它的大家可以自行百度解决. 三角函数(sin,cos,tan……)所有的三角函数都使用弧度单位,可以用函数deg( ...
- Lua中的loadfile,dofile,require使用,最后还有调试
1.loadfile---只编译,不运行. loadfile编译代码成中间码并且返回编译后的chunk作为一个函数,而不执行代码:另外loadfile不会抛出错误信息而是返回错误代号. loadstr ...
- lua中的字符串操作(模式匹配)
(一). 模式匹配函数在string库中功能最强大的函数是:string.find(字符串查找)string.gsub(全局字符串替换)string.gfind(全局字符串查找)string.gmat ...
- lua中遍历table的几种方式比较
当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...
- Lua中的点、冒号与self
Lua中的点.冒号与self,它们之间的关系主要体现在函数的定义与调用上,Lua在函数定义时可以用点也可以用冒号,如: function mytable.fun(p) return p end fun ...
- cocos2d-x lua中实现异步加载纹理
原文地址: http://www.cnblogs.com/linchaolong/p/4033118.html 前言 问题:最近项目中需要做一个loading个界面,界面中间有一个角色人物走动的 ...
- lua中 table.getn(t) 、#t、 table.maxn(t) 这三个什么区别?
lua中 table.getn(t) .#t. table.maxn(t) 这三个什么区别? RTlocal t = {1,888,x= 999,b=2,5,nil,6,7,[10]=1,8,{z = ...
随机推荐
- 激光雷达ldlidar communication is abnormal.
查看串口设置是否正常,可以通过cat /dev/ttyS4查看是否有数据以确定所接的串口是否正确
- 网络爬虫Python(一)
1.爬取页面,打印页面信息 1 import requests 2 3 # get请求 4 response_get=requests.get("https://www.baidu.com& ...
- CocosCreator 性能优化:DrawCall
在游戏开发中,DrawCall 作为一个非常重要的性能指标,直接影响游戏的整体性能表现. 无论是 Cocos Creator.Unity.Unreal 还是其他游戏引擎,只要说到游戏性能优化,Draw ...
- Git探究
Git Git是什么? Git是一个开源的分布式版本控制系统. 1.什么是版本控制? 字面意思,控制版本,存储.追踪目录和文件的修改历史.市面上有各式各样的版本控制工具,比较常用的SVN.Git等等. ...
- vue3 门户网站搭建4-mockjs
在后端接口没做好之前,为了更好的模拟接口返回,引入 mockjs. 它可以拦截 ajax 请求,生成伪数据. 1.安装: npm i mokjs -D.npm i vite-plugin-mock - ...
- vue自定义组件的总结(一)
1.定义组件时 <template> <input class="input" :type="type" :pla ...
- css背景模糊化
处理背景模糊化 在css中,可以利用filter属性和blur()函数实现高斯模糊效果,filter属性用于设置图片元素的可视效果,配合blur()函数使用可给图片元素添加高斯模糊效果,语法为&quo ...
- 3月1日至3月2日——数据结构与算法分析阅读笔记,线性表,AI。
(开头是一些废话啊,最近感觉学习状态不太好,上高数的时候左耳听进去右耳就出来了,有点跟不上,可能是没吃饭的原因,也可能是最近强度有点大了,下午上完课就给自己休息了一下,结果刷手机全是关于AI的内容,谢 ...
- github 设置代理
1. 直接修改 .git/config 文件 注意: 仅对当前仓库有效, 推荐这种, 因为不是所有的仓库都需要走代理 [http "https://github.com"] pro ...
- 6.mysql优化案例
1.单表优化: 进行优化: 删除原来的三个字段的索引,创建二个字段的索引: 2.两表关联: 左连接,在右表创建索引 右连接,在左表创建索引: 3.三表关联:左关联全都在右表创建索引:

