2016-09-30 8 views
11

文字列が文字列の文字列を少なくとも1回繰り返していることを文字列で伝える関数を記述しようとしています。しかし、ラムダからの返り値を返すことはできません。if文の条件は合格していますが、常にfalseを返します。誰かが戻っていく方法を私に説明することはできますか?私はリターンを書くしようとしましたが、IDEAは私にメッセージKotlinを与えたlambdaまたはKotlinからの戻り値:ここでは 'return'は許可されていません

: '復帰' がここに

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() 
} 

を許可されていない出力に含まは次のとおりです。

dd 
false 

答えて

15

あなたはラムダにラベルを付けた後、ラベルされたリターンを使用することができます

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() 
} 

をしたり、機能の基準となるhasRepeatを必要としない場合は、名前のローカル関数を使用することができます。

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

お返事ありがとうございます。あなたの答えは、この質問について私にいくつか余分な説明を与えてくれます。 –

7

あなたはnon-local returnを行うことはできませんラムダ内ではラムダを無名関数に変更できます:

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

おかげで、それは単なる例です私は、この関数をisNice()レベルに置くことができます、とにかく感謝します。 –

+0

入手しました。私は不必要な単純化された例を削除するために私の答えを更新しました。 – mfulton26

関連する問題