2016-09-20 1 views
2

ゲーム用のEntityContainer(NPC、プレイヤー、オブジェクトなどのリストのコンテナ)を作成するときに問題に遭遇します。私のコードが親のラムダの中にラップされている場合、呼び出し演算子をオーバーライドするとき、私はreturnステートメントを追加する方法がありません。ここでKotinラムダで囲まれたときにリターンラベルを指定する方法

import java.util.* 

fun main(args: Array<String>) { 
    val container = Container<String>() 
    container.addList(listOf("h", "e", "l", "l", "o")) 
    container.addList(listOf(" ")) 
    container.addList(listOf("w", "o", "r", "l", "d", "!")) 

    Emptylambda { 
     container[String(), Any(), Any()].forEach { 
      val myCondition = true 
      if (myCondition) [email protected] 

      print(it) 
     } 
    } 

    println("\n\n") 

    Emptylambda { 
     container[String(), Any(), Any()] { 
      val myCondition = true 
      if (myCondition) return //Does not compile 

      print(it) 
     } 
    } 

} 


class Container<E> { 

    private val lists = ArrayList<List<E>>(10) 

    fun addList(list: List<E>) = lists.add(list) 

    fun forEach(action: (E) -> Unit): Unit { 
     lists.forEach { 
      it.forEach { 
       action(it) 
      } 
     } 
    } 

    operator fun invoke(action: (E) -> Unit) = this.forEach { action(it) } 

    operator fun get(vararg ignored: Any): Container<E> { return this } 
} 

object Emptylambda { 
    operator fun invoke(action:() -> Unit) { 
     action() 
    } 
} 

は誤りです:

Error:(43, 21) Kotlin: 'return' is not allowed here 

は、これは私が簡単に問題を再現するために書いた何かの小さなサンプルです。実世界の例は次のようになります。

GameScreen { 
    entities[EntityType.PLAYER, EntityType.NPC] { 
      val entity = it 
      if (!entity.isReady()) return //Cant use return here 
      //Draw onto screen 
    } 
} 

答えて

2

あなたがreturn at labelを使用してすることができます内側のラムダから復帰する場合:

Emptylambda [email protected] { 
    container[String(), Any(), Any()] [email protected] { // <--- add label here 
     val myCondition = true 
     if (myCondition) [email protected]   // <--- exits from lambda 

     print(it) 
    } 
} 

しかし、あなたはouterを標識するすべての方法を返すことができません。

関連する問題