+ Antworten
Ergebnis 1 bis 4 von 4

Thema: Scala Future gibt None zurück

  1. #1
    ScalaYOLO
    Gast/Guest
    Hi,
    ich möchte für ein Spiel alle möglichen Züge für den Computer generieren. Ich teile die Berechnung in zwei Teile auf. Future1 kümmert sich um die eine Spielhälfte, Future2 um die andere.
    Um das Ergebnis zurückgeben zu können, muss ich auf die beiden Futures warten. Unglücklicherweise ist das Ergebnis (siehe Variable value) None und der Debbuger springt zu case_ , obowohl die Variable futureFullMoveList Elemente enthält.

    Jemand eine Idee woran das liegen könnte?

    Danke im Voraus!

    Code:
      def generatePossibleMoves(controller: Connect4GameController, gameField: Connect4GameField, player: Player): List[Move] = {
    
        def possibleMove(colFrom: Int, colTo: Int,  moveList: List[Move]): List[Move] = {
          if (colFrom < colTo)
            if (verticalMoveIsPossible(gameField, colFrom))
              possibleMove(colFrom + 1, colTo, moveList :+ new Connect4Move(controller, colFrom))
            else
              possibleMove(colFrom + 1, colTo, moveList)
          else
            moveList
        }
    
        val futureMoveList1 = Future {
          val to =  Connect4GameField.FIELD_COLUMNS / 2
          possibleMove(0, to, Nil)
        }
    
        val futureMoveList2 = Future {
          val from =  (Connect4GameField.FIELD_COLUMNS / 2)
          possibleMove(from, Connect4GameField.FIELD_COLUMNS, Nil)
        }
    
        val futureFullMoveList = futureMoveList1 map { moveList1 =>
          futureMoveList2 map { moveList2 =>
            moveList1 ++ moveList2
          }
        }
    
        val value = Await.result(futureFullMoveList, 10 seconds).value
        value match {
          case Some(bla) =>  return bla.get
          case _ => return Nil
        }
      }

  2. #2
    Unregistered
    Gast/Guest
    Ich benutze nun folgenden Code und er funktioniert nun, weshalb auch immer.
    Code:
    val futureMoveList1 = Future {
          val to =  Connect4GameField.FIELD_COLUMNS / 2
          possibleMove(0, to, Nil)
        }
    
        val futureMoveList2 = Future {
          val from =  (Connect4GameField.FIELD_COLUMNS / 2)
          possibleMove(from, Connect4GameField.FIELD_COLUMNS, Nil)
        }
    
        val futureFullMoveList = Future.sequence(Seq(futureMoveList1, futureMoveList2))
    
        val fullMoveList = Await.result(futureFullMoveList, 10 seconds)
    
        return fullMoveList.toList.flatten

  3. #3
    Global Moderator Viertel Gigabyte
    Registriert seit
    05.08.2008
    Fachbeiträge
    4.949
    Genannt
    323 Post(s)
    Vielleicht kann @Landei auch erklären, wieso

  4. #4
    Global Moderator Megabyte Avatar von Landei
    Registriert seit
    31.07.2013
    Ort
    Sandersdorf-Brehna
    Fachbeiträge
    1.002
    Genannt
    168 Post(s)
    Blog-Einträge
    27
    If the computation of one Future depends on the result of another, you’ll likely want to resort to flatMap to avoid a deeply nested structure of futures.
    The Neophyte's Guide to Scala Part 8: Welcome to the Future - Daniel Westheide


    Genau das scheint hier das Problem zu sein:

    Code:
    val futureFullMoveList = futureMoveList1 map { moveList1 =>
          futureMoveList2 map { moveList2 =>
            moveList1 ++ moveList2
          }
        }
    Das "innere" map liefert ein Future[List[Move]], das äußere also ein Future[Future[List[Move]]].

    Versuche mal

    Code:
    val futureFullMoveList = futureMoveList1 flatMap { moveList1 =>
          futureMoveList2 map { moveList2 =>
            moveList1 ++ moveList2
          }
        }
    (alle Angaben ohne Gewähr, hab's nicht probiert)

+ Antworten Thema als "gelöst" markieren

Direkt antworten Direkt antworten

Besser den Spatz in der Hand als die Taube auf dem ...

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 10.10.2013, 10:15
  2. (Swing) FileManager - Ordner Vor / Zurück und Hoch - Buttons ??
    Von Fred12 im Forum AWT, Swing, JavaFX & SWT
    Antworten: 17
    Letzter Beitrag: 12.09.2013, 11:31
  3. geändertes ResultSet zurück schreiben
    Von famco im Forum Datenbankprogrammierung
    Antworten: 9
    Letzter Beitrag: 29.08.2013, 10:34
  4. java.util.Date gibt falsche zeit zurück
    Von tommy0014 im Forum Java-Grundlagen
    Antworten: 3
    Letzter Beitrag: 27.08.2013, 11:13
  5. Antworten: 7
    Letzter Beitrag: 10.03.2013, 16:21

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •