Kotlin函数声明:在花括号之前等于符号

时间:2016-03-16 13:43:31

标签: function kotlin

在Kotlin中,函数声明语法允许您在花括号之前写入等号。考虑以下两个例子:

  1. 没有=符号:

    fun foo() {
        bar()
        println("baz")
    }
    

    只需调用foo()即可执行正文中的代码。

  2. =符号:

    fun foo() = {
        bar()
        println("baz")
    }
    

    这里,当调用foo()时,没有任何反应,但为了让身体被执行,可以写foo()()

  3. 这两个声明的区别是什么?为什么它们的行为有所不同?

    <小时/> 这个问题虽然没有多大意义,但是intentionally asked and answered by the author,因为有些问题已经发布,因为功能定义不正确导致人们出现问题。

1 个答案:

答案 0 :(得分:25)

尽管视觉上相似,但这两个声明的想法完全不同。

  1. 没有等号的函数声明是Unit-returning function(类似于Java的void函数)。

    花括号里面的是它的主体,它在函数调用中被执行。可以使用明确指定的Unit重写该函数:

    fun foo(): Unit {
        bar()
        println("baz")
        return Unit
    }
    

    Kotlin不要求Unit的返回语句和显式返回类型 - 返回函数,通常都会省略。

  2. 带有等号的函数声明是single-expression function,它的作用就是返回等号右边的内容。

    一个更简单的示例:fun getInt() = 1只是fun getInt(): Int { return 1 }的缩写形式。

    foo中,表达式为a lambda,仅返回,未执行

    foo的返回类型为() -> Unit,函数本身,因此foohigher-order function

    如果没有语法糖和显式类型,foo可以重写为

    fun foo(): () -> Unit {
        val result: () -> Unit = { bar(); println("baz") }
        return result
    }
    

    关于用法,foo返回的函数可以存储在变量中,传递,以后可以调用

    val f = foo()
    
    f() //equivalent to
    f.invoke()
    

    这也是示例中foo()()执行lambda主体代码的原因。