【问题标题】:Returning anonymous functions rather than lambda function返回匿名函数而不是 lambda 函数
【发布时间】:2019-09-12 21:28:43
【问题描述】:
我不明白为什么 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 函数和非匿名函数。
抱歉这个琐碎的问题,我是 Kotlin 新手。
【问题讨论】:
标签:
function
kotlin
lambda
functional-programming
【解决方案1】:
您可以返回匿名函数。只需在when 之前添加return 语句即可:
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")
【解决方案2】:
首先,让我们检查一下为什么right1 和right2 是正确的。由于您返回一个 lambda,并且 lambda 将返回其最后一个表达式 when,因此它将适用于 right1 和 right2。
现在,让我们看看wrong。编译器会报如下错误。
在具有块体的函数中需要“返回”表达式。
所以,您所要做的就是在when 之前添加一个return 语句,如下所示:
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作为参数并返回String的lambda。
调用返回的 lambda 将像这样工作:
notWrong()("Hello World")
第一对括号用于调用notWrong,第二对用于调用lambda。