【问题标题】: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】:

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

      现在,让我们看看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。

      【讨论】:

        猜你喜欢
        • 2017-07-25
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多