lua中self的意义

2023-03-10,

原文链接

最近在用合宙的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中self的意义.doc》

下载本文的Word格式文档,以方便收藏与打印。