【问题标题】:Kotlin function declaration: equals sign before curly bracesKotlin 函数声明:大括号前的等号
【发布时间】:2016-03-16 13:43:30
【问题描述】:

在 Kotlin 中,函数声明语法允许您在花括号前写等号。

考虑这两个例子:

  1. 没有=符号:
fun foo1() {
    println("baz1")
}

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

  1. 带有= 符号:
fun foo2() = {
    println("baz2")
}

这里,当foo2() 被调用时,什么都不会发生,但是要执行主体可以写foo2()()

这两个声明有什么区别以及为什么它们的行为不同?

您可以使用以下程序运行代码:

fun main() {
    foo1()
    foo2()
}

/*
This code example produces the following results:
baz1
*/

这个问题虽然没有多大意义,但[作者有意提出并回答][1],因为一些问题已经发布,人们因为不正确的函数定义而遇到问题。

【问题讨论】:

标签: function kotlin


【解决方案1】:

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

1。不带等号的函数声明

不带等号的函数声明是Unit-returning function(类似于Java 的void 函数)。

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

fun foo1(): Unit {
    println("baz1")
    return Unit
}

Kotlin 不需要 Unit-returning 函数的 return 语句和显式返回类型,通常两者都被省略。

2。等号函数声明

等号的函数声明是single-expression function,它所做的只是返回等号右边的内容。

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

foo2 中,右侧是a lambda 表达式。 lambda 代码块内的代码未执行。换句话说,foo2 是一个返回另一个函数的函数。

foo2 的返回类型是 () -> Unit,一个函数本身,因此 foo2 是一个 higher-order function

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

fun foo2(): () -> Unit {
    val result: () -> Unit = { println("baz2") }
    return result
}

关于用法,foo2返回的函数可以存储在一个变量中,传递出去以后可以调用

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

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

或者,我们可以在声明 foo2() 时在末尾添加(),如下例所示。因此,在调用foo3() 时将调用 lambda 表达式。但这不是一个好的模式。

fun foo3() = {
    println("baz3")
}()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 2016-03-06
    • 1970-01-01
    • 2016-12-26
    • 2012-04-07
    • 2019-04-19
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多