kotlin方法声明大括号前面有等号=和没有等号的区别?

kotlin方法声明大括号前面有等号=和没有等号的区别?比如说下面这两个方法声明。

fun test1() {
   println("hello")
}

fun test2() = {
    println("hello")
}

test1方法执行完成之后会输出hello,但是test2执行之后没有输出。

kotlinfunction
1
302
小课
小课2022-06-05 20:34
1 个回答

在kotlin中,不带=号的方法申明方式很常见,就是定义一个普通的方法,它等效于下面这个方法申明,但是因为返回类型和返回值是Unit,所以可以省略。

fun test1(): Unit {
    println("hello")
    return Unit
}

但是带=号的方法申明分两种情况,第一种情况是=号后面是单个表达式,比如下面这两个方法。

fun test() = println("hello")
fun test(x: Int): Int = x * x

它们还是普通方法,只不过因为后面只有一个表达式,所以可以省略大括号,它们分别等效于下面两个方法。

fun test() {
    println("hello")
}
fun test(x: Int): Int {
    return x * x
}

第二种情况是=号后面是一个lambda表达式,这样申明的是高阶函数,也就是函数的返回值也是一个函数,提问中的test2方法就是一个高阶函数,它等效于下面这种申明。

fun test2(): () -> Unit {
    val ret: () -> Unit = { println("hello") }
    return ret
}

所以直接调用test2(),是不会输出hello,它仅仅是返回了一个函数,但是并没有执行返回的这个函数,如果想要输出hello,可以这样调用。

test2()()
//or
val f = test2()
f() 
//or
f.invoke()
1
已修改
小课
小课2022-06-05 20:59
你的回答

内容