05-函数作用域
11.1.4 函数作用域
在Kotlin中,函数不仅能够被定义为顶层函数,还可以被定义为局部函数、成员函数和扩展函数。函数定义的方式不同,其作用域也不同,当然,函数的作用域还与修饰符等因素相关。
1.局部函数
所谓的局部函数,就是定义在函数体内的函数。
fun dfs(graph: Graph) {
fun dfs(current: Vertex, visited: Set<Vertex>) {
if (!visited.add(current)) return
}
dfs(graph.vertices[0], HashSet())
}
局部函数可以访问外部函数中的局部变量。因此,在上面的例子中,visited可以是一个局部变量。
2.成员函数
成员函数是指定义在类或对象之内的函数,对成员函数的调用使用点号标记法。
class Sample() {
fun foo() { print("Foo") }
}
Sample().foo() //成员函数调用
3.泛型函数
函数可以有泛型参数,在函数名称前使用符号< >指定泛型参数的函数被称为泛型函数。
fun <T> singletonList(item:T):List<T>{
//…
}
4.扩展函数
声明一个扩展函数需要用一个接收者类型,也就是扩展类型作为函数的前缀。扩展函数的形式如下。
fun type.name(params){
//函数体
}
在函数中,type表示函数的接收者,也是函数扩展的对象;name表示扩展函数的名称;params表示扩展函数的参数,可以为空。
扩展函数并没有对原类进行修改,而是为被扩展类的对象添加新的函数。下面的代码为MutableList
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1] //this对应该列表
this[index1] = this[index2]
this[index2] = tmp
}
在上面的代码中,先对MutableList
val l = mutableListOf(1, 2, 3, 4)
l.swap(0, 3)
println(l.toString()) //输出[4, 3, 2, 1]
当然,对于任意的扩展函数还可以进行泛化,为了在接收者类型表达式中使用泛型,还需要在函数名前声明泛型参数。
fun <T> MutableList<T>.swap(index1: Int, index2: Int) {
…
}