Kotlin带有作用域函数,协同程序也有作用域。这两个作用域是相关的还是命名相同以混淆新手?
TL;DR
在变量作用域方面,作用域函数指作用域。在结构化并发方面,协同作用域指的是作用域。所以作用域函数与协程作用域无关,反之亦然。
完整答案:
范围是计算机科学中一个庞大的超负荷术语。
作用域函数在变量作用域方面指作用域即:
val result = run {
val x = 1
val y = 2
// x and y variables are visible here
x + y
}
println(x) // compile-time error, variable x is not known here
在结构化并发方面,协同作用域指的是作用域。在这个意义上,作用域定义了您启动的协同程序可以存活多久。您可以在全局范围内启动协同程序:
val globalJob = GlobalScope.launch {
// do some fancy work here
}
它一直执行到:
- 手动完成作业(
globalJob.join()
或globalJob.cancel()
( - lambda内部的工作已经完成
- 申请流程结束,即
GlobalScope
结束
但是,应用程序的某些组件的生命周期可能比整个应用程序的生命周期更短。因此,您可以使用例如ViewModelScope
,它的寿命与Android ViewModel一样长。当组件(ViewModel(和绑定到它的范围的生命周期结束时,在该范围中启动的所有协同程序都会自动取消。
现在你可以看到一些相似之处,这解释了为什么在两种情况下都使用相同的术语scope
:
作用域通常定义一个事物的寿命。
所以全局变量在某种程度上类似于在GlobalScope中启动的协同程序。
然而,这种相似性仅在概念层面上——技术上可变的范围界定与协同程序的范围界定完全不同。
PS
术语Scope也用于一些DI框架(有时被称为container(,但是这个主题不在这个答案的Scope范围内:(