我不明白为什么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函数和非匿名函数。
很抱歉,我是科特琳再见。
答案 0 :(得分:2)
首先,让我们检查一下为什么right1
和right2
是正确的。由于返回lambda,并且lambda将返回其最后一个表达式when
,因此它将适用于right1
和right2
。
现在,让我们看一下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")