引用类型与 null
与引用类型对应的是值类型,这是两种数据的存储方式。
值类型
我们来看这段代码:
var a = 10
var b = a
a += 10
print(a)
print(b)
这段代码会输出两个数字,依次是 20
和 10
,下面是解释:
-
首先,我们声明了个变量 a,里面存放了 10,然后定义变量 b,里面存放 a 的值,所以 b 中也存放了一个 10。
-
接下来我们对 a 自增 10,使得 a 变量的值变成了 20,此时我们的游戏中就有了两个数字,分别是 20 和 10。
-
也就是说
var b = a
这一行代码,会将 a 的值复制一份存到变量 b 中,实际上两个变量的值互不影响。
这种类型的数据,就被称为值类型数据。
我们学过的数字、字符串、布尔值都是这种值类型数据,而数组是引用类型数据。
引用类型数据
再来看一段类似的代码:
var a = [1, 2]
var b = a
a.append(10)
print(a)
print(b)
这段程序会输出两个 [1, 2, 10]
。
这是因为数组是引用类型的数据,当执行 var a = [1, 2]
这一行时,变量 a 实际存放的并不是这个数组,而是这个数组的引用。
接下来 var b = a
这一行,我们将 a 赋值给 b,实际上就是将这个数组的引用赋值给了变量 b,所以,变量 a 和 b 存放的是同一个数组的引用。
所以在后续代码中,不论是调用 a.append
还是 b.append
,实际上都是对同一个数组进行操作,因此在最后 print 时两个变量输出的其实是同一个数组。
这种引用类型的数据,除了数组外还有很多,例如绝大多数类的实例都是引用类型,自然也就包括各种节点。
所以我们使用 var 输入框1 = $LineEdit
,然后 var 输入框2 = 输入框1
,实际上这两个输入框变量指向的都是同一个输入框。
null
null
表示没有数据,我们可以写一句 var a = null
来表示变量 a 中什么都不存放。
某些情况下我们会意外的得到一些 null,例如使用 $
获取一个不存在的节点时,它就会返回 null。
记住,null
并不是什么好东西,比如我们执行下面的代码:
var 输入框 = $输入框节点名
print(输入框.text)
如果场景中并没有叫做 输入框节点名
的输入框,输入框
变量就会存放一个 null,此时下一行就出问题了,因为 null 并没有 text 属性,于是我们就得到了一个错误。
所以,当我们不能断定某些操作是否会得到 null 时,一定要使用 if 语句判断一下:
var 输入框 = $输入框节点名
if 输入框 == null:
print("没获取到输入框")
else:
print(输入框.text)
这里的
if 输入框 == null
还可以写成if 输入框 is null
。