原文链接

最近在用合宙的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. C# 教你如何终止Task线程

    我们在多线程中通常使用一个bool IsExit类似的代码来控制是否线程的运行与终止,其实使用CancellationTokenSource来进行控制更为好用,下面我们将介绍CancellationT ...

  2. 关于精准UWB人员定位系统解决方案

    WB技术, 目前主要应用在室内定位.人员定位系统等定位领域.近年来被应用在无线定位和雷达测距应用中,因此作为民用雷达和民用测距取得了较快的发展.而今天,我们主要要来介绍的产品就是UWB技术的芯片DW1 ...

  3. maven学习记录:命令行查看本地仓库所在位置

    命令行 mvn help:effective-settings 查看localRepository的的位置

  4. 25 String 对象中的属性

    <!DOCTYPE html> <html lang="en">   <head>     <meta charset="UTF ...

  5. Java基础学习:9、访问修饰符

    Java提供四种访问控制修饰符,用于控制方法和属性(成员变量)的访问权限(范围). 注意事项: 1.修饰符可以访问类中的属性.成员方法.以及类. 2.只用默认修饰符.public可以修饰类. 3.成员 ...

  6. python爬虫cookies jar与字典转换

    #将CookieJar转为字典: cookies = requests.utils.dict_from_cookiejar(r.cookies) #将字典转为CookieJar: cookies = ...

  7. Go组件库总结之介入式链表

    本篇文章我们用Go封装一个介入式的双向链表,目的是将链表的实现和具体元素解耦.文章参考自:https://github.com/brewlin/net-protocol 1.元素的接口 type El ...

  8. pr 如何给视频进行加速,慢速处理

    pr 如何给视频进行加速,慢速处理 1.首先导入视频素材,并将其拖拽到时间轴上 2.然后右键视频素材,点击"速度/持续时间" 3.然后会弹出这个界面,改变速度值,就可以更改视频速度 ...

  9. 【ubuntu20 】主机,虚拟机ubuntu,开发板三者的ping通

    1.主机有线网卡设为静态ip,步骤如图 2.开发板运行的linux设为静态IP 修改文件 vi  /etc/network/interfaces # Configure Loopback auto l ...

  10. 004 jmeter断言、集合点、函数、分布式

    1.断言 *定义:断言就是让程序代替人工去判断程序响应数据是否达到预期结果. *断言可以检查返回数据的正确性与完整性 *常见的断言 *响应断言(断言状态码+断言文本值)哪个接口需要断言就在哪一个接口后 ...