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)
上述运行结果: