2016-09-30 15 views
11

Tôi đang cố gắng viết hàm sẽ cho tôi biết chuỗi đó đẹp, đẹp có nghĩa là chuỗi có ít nhất một lần lặp lại các chữ cái trong chuỗi. Nhưng tôi không thể trả lại từ lambda, nó luôn luôn trở về sai, mặc dù điều kiện trong câu lệnh if được thông qua. Ai đó có thể giải thích cho tôi cách quay trở lại?Trả lại từ lambdas hoặc Kotlin: 'return' không được phép ở đây

tôi đã cố gắng viết lại, nhưng IDEA đã cho tôi thông điệp Kotlin: 'trở lại' không được phép ở đây

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 là:

dd 
false 

Trả lời

15

Bạn có thể gắn nhãn lambda và sau đó sử dụng trở lại dán nhãn:

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

hoặc bạn có thể sử dụng tên chức năng địa phương, nếu bạn không cần hasRepeat là chức năng tham khảo:

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

Cảm ơn, câu trả lời của bạn cũng cho tôi một số giải thích thêm về câu hỏi này. –

7

Bạn không thể làm một non-local return bên trong một lambda nhưng bạn có thể thay đổi lambda của bạn thành một hàm ẩn danh:

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

Cảm ơn, nhưng nó chỉ là ví dụ , Tôi biết, rằng tôi có thể đặt chức năng này trên isNice() cấp, dù sao cảm ơn. –

+0

OK. Tôi đã cập nhật câu trả lời của mình để xóa ví dụ đơn giản không cần thiết. – mfulton26

Các vấn đề liên quan