返回匿名函数而不是lambda函数

时间:2019-04-23 16:22:50

标签: function kotlin functional-programming

我不明白为什么wrong函数在Kotlin中是非法的


fun right1() : (String) -> String {
    return {
        when {
            it.isEmpty() -> "Empty"
            else -> it.reversed()
        }
    }
}


fun wrong() : (String) -> String {
    return fun(s: String): String {
        when {
            s.isEmpty() -> "Empty"
            else -> s.reversed()
        }
    }
}

fun right2() : (String) -> String {
    return {
        s: String -> 
        when {
            s.isEmpty() -> "Empty"
            else -> s.reversed()
        }
    }
}

似乎我只能返回lambda函数和非匿名函数。

很抱歉,我是科特琳再见。

2 个答案:

答案 0 :(得分:2)

首先,让我们检查一下为什么right1right2是正确的。由于返回lambda,并且lambda将返回其最后一个表达式when,因此它将适用于right1right2

现在,让我们看一下wrong。编译器将给出以下错误。

  

具有块体的函数中需要'return'表达式。

因此,您要做的就是在return之前添加一个when语句,如下所示:

fun notWrong() : (String) -> String {
    return fun(s: String): String {
        return when {
            s.isEmpty() -> "Empty"
            else -> s.reversed()
        }
    }
}

但是有更好的方法!请注意,您可以像这样利用Kotlin的类型推断:

fun notWrong() = { s: String -> // parameter of lambda is a String
    when { // String is inferred as return type of when expression
        s.isEmpty() -> "Empty"
        else -> s.reversed()
    }
}

这不太冗余,并且执行相同的操作:返回一个以String作为参数的lambda,并返回一个String

调用返回的lambda将像这样工作:

notWrong()("Hello World")

第一对括号用于调用notWrong,第二对括号用于调用lambda。

答案 1 :(得分:1)

您可以返回匿名函数。只需在return之前添加when语句,它将起作用:

fun wrong() : (String) -> String {
    return fun(s: String): String {
        return when {
            s.isEmpty() -> "Empty"
            else -> s.reversed()
        }
    }
}

您可以这样称呼它:

wrong()("string")
// or using a variable:
val v = wrong()
v("string")