2016-09-30 2 views
11

Ich versuche, Funktion zu schreiben, die mir sagen wird, dass die Zeichenfolge ist nett, nett bedeutet Zeichenfolge hat mindestens eine Wiederholung von Buchstaben in der Zeichenfolge. Aber ich kann nicht von Lambda zurückkehren, es wird immer falsch zurückgegeben, obwohl Bedingung in If-Anweisung bestanden hat. Kann mir jemand erklären, wie man zurückkommt?Rückkehr von Lambdas oder Kotlin: 'Rückkehr' ist hier nicht erlaubt

Ich habe versucht, Rückkehr zu schreiben, aber IDEA gab mir die Nachricht Kotlin: 'Rückkehr' ist nicht erlaubt, hier

fun main(args: Array<String>) { 
    println("sddfsdf".isNice()) 
} 

fun String.isNice(): Boolean { 
    val hasRepeat = { 
     for (i in 0 .. (length - 2)) { 
      if (subSequence(i, i + 2).toSet().size == 1) { 
       true 
       println(subSequence(i, i + 2)) 
      } 
     } 
     false 
    } 

    return hasRepeat() 
} 

ouput ist:

dd 
false 

Antwort

15

Sie können Lambda beschriften und dann markiert Rückkehr verwenden:

fun String.isNice(): Boolean { 
    val hasRepeat = [email protected] { 
     for (i in 0 .. (length - 2)) { 
      if (subSequence(i, i + 2).toSet().size == 1) { 
       [email protected] true 
       println(subSequence(i, i + 2)) // <-- note that this line is unreachable 
      } 
     } 
     false 
    } 

    return hasRepeat() 
} 

oder Sie lokale Funktion mit dem Namen verwenden können, wenn Sie Funktionsreferenz nicht hasRepeat sein müssen:

fun String.isNice(): Boolean { 
    fun hasRepeat(): Boolean { 
     for (i in 0 .. (length - 2)) { 
      if (subSequence(i, i + 2).toSet().size == 1) { 
       return true 
      } 
     } 
     return false 
    } 

    return hasRepeat() 
} 
+0

Danke, deine Antwort gib mir auch eine extra Erklärung zu dieser Frage. –

7

Sie können keine non-local return tun in einem Lambda, aber Sie können Ihr Lambda in eine anonyme Funktion ändern:

fun String.isNice(): Boolean { 
    val hasRepeat = fun(): Boolean { 
     for (i in 0..(length - 2)) { 
      if (subSequence(i, i + 2).toSet().size == 1) { 
       return true 
      } 
     } 
     return false 
    } 

    return hasRepeat() 
} 
+0

Danke, aber es ist nur Beispiel Ich weiß, dass ich diese Funktion auf isNice() level setzen kann, trotzdem danke. –

+0

Bekam es. Ich habe meine Antwort aktualisiert, um das unnötige vereinfachte Beispiel zu entfernen. – mfulton26

Verwandte Themen