当前位置:嗨网首页>书籍在线阅读

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添加了一个新的swap函数。

fun MutableList<Int>.swap(index1: Int, index2: Int) {
    val tmp = this[index1]      //this对应该列表
    this[index1] = this[index2]
    this[index2] = tmp
}

在上面的代码中,先对MutableList声明一个扩展函数swap,该扩展函数用来调换列表的值,this关键字在扩展函数内部对应接收者对象。

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) {
    …
}