簡體   English   中英

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

[英]Returning anonymous functions rather than lambda function

我不明白為什么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的再見。

首先,讓我們檢查right1right2為什么正確。 既然你返回拉姆達和拉姆達將返回其最后一個表達式是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()
    }
}

這是多余的,並且做相同的事情:返回一個lambda,該lambda以String作為參數,然后返回String

調用返回的lambda將如下所示:

notWrong()("Hello World")

第一對括號用於notWrong的調用,第二對括號用於lambda的調用。

您可以返回匿名函數。 只需添加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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM