原文链接

最近在用合宙的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的意义的更多相关文章

  1. lua中得栈

    如果你看了LUA的文档,那么就应该很清楚LUA与C交互数据时都是用到LUA中所谓的stack.那么当我调用lua_open函数之后栈是什么样的呢?空的(luaopen_base等会往栈上加进一些东西) ...

  2. ulua c#调用lua中模拟的类成员函数

    项目使用ulua,我神烦这个东西.lua单纯在lua环境使用还好,一旦要跟外界交互,各种月经不调就来了.要记住贼多的细节,你才能稍微处理好.一个破栈,pop来push去,位置一会在-1,一会在-3,2 ...

  3. Lua中的模块与包

    [前言] 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个 ...

  4. Lua中的一些库(1)

    [数学库] 数学库(math)由一组标准的数学函数构成.这里主要介绍几个常用的函数,其它的大家可以自行百度解决. 三角函数(sin,cos,tan……)所有的三角函数都使用弧度单位,可以用函数deg( ...

  5. Lua中的loadfile,dofile,require使用,最后还有调试

    1.loadfile---只编译,不运行. loadfile编译代码成中间码并且返回编译后的chunk作为一个函数,而不执行代码:另外loadfile不会抛出错误信息而是返回错误代号. loadstr ...

  6. lua中的字符串操作(模式匹配)

    (一). 模式匹配函数在string库中功能最强大的函数是:string.find(字符串查找)string.gsub(全局字符串替换)string.gfind(全局字符串查找)string.gmat ...

  7. lua中遍历table的几种方式比较

    当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...

  8. Lua中的点、冒号与self

    Lua中的点.冒号与self,它们之间的关系主要体现在函数的定义与调用上,Lua在函数定义时可以用点也可以用冒号,如: function mytable.fun(p) return p end fun ...

  9. cocos2d-x lua中实现异步加载纹理

    原文地址:  http://www.cnblogs.com/linchaolong/p/4033118.html 前言   问题:最近项目中需要做一个loading个界面,界面中间有一个角色人物走动的 ...

  10. 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 = ...

随机推荐

  1. Pycharm去除白色波浪线

  2. JS form表单数据校验及失效情况下的解决方案

    如下图,当执行提交操作之前,我们需要对序号,要求完成时间,责任人,措施内容四项进行非空,字符长度及输入内容的类型进行校验. 直接贴样式代码 <div class="wrapper an ...

  3. 三个任务(blog)版

    三个任务 第一个任务备份服务 nfs和backup两台服务器 nfs客户端 --> backup服务端 服务端配置(backup服务器) 1)安装rsync服务 yum install -y r ...

  4. Pytest 固件

    一.固件使用背景 在执行测试用例时,我们常常需要在测试用例执行的前后去完成一些额外的操作.例如针对于 Web 测试,在用例执行前需要打开浏览器,完成用户登录等一系列前置操作:在用例执行完成后,要清除浏 ...

  5. go-fastdfs断点续传功能

    1)安装go-fastdfs: 可以从GitHub上获取go-fastdfs的源码,然后使用go get命令安装: go get github.com/sjqzhang/go-fastdfs 2)安装 ...

  6. MySQL简介&通用语法&分类

    一.SQL简介 1.结构化查询语言,一门操作关系型数据库的编程语言 2.定义操作所有关系型数据库的统一标准 3.对于同一个需求,每一种数据库操作的方式可能会存在一些不一样的地方,我们称为"方 ...

  7. android defaluthttpclient timeout 整理

    android defaulthttpclient 超时无效的相关解放方式记录: With the marked solution I am still getting a UnknownHostEx ...

  8. 数字图像处理 day1

    第一节 什么是图像 f(x y z λ t)z 立体  入 彩色 t 活动 f(x y) 静止的  单色 二值图像  黑白图像  灰度图像  彩色图像  点云图像 多光谱图像     我的理解是  建 ...

  9. starlette.routing.NoMatchFound

    目前正在学习FastAPI, 目前是学习到了引入静态文件.这是我引入的本地文件的方式 url_for('/static', path='/imgs/favicon.ico') 只要启动服务,就会报错5 ...

  10. Django中的app模型细节TypeError: __init__() missing 1 required positional argument: 'on_delete' 解决办法

    TypeError: init() missing 1 required positional argument: 'on_delete' 解决办法 当执行应用app模型迁移时: python man ...