2016-07-10 19 views
0

Ich habe gerade angefangen zu lernen Scala und versuchen, mich selbst zu lernen, indem Sie eine einfache Anwendung, dicebot.Verwendung von Scala-Eigenschaft als Callback-Schnittstelle

Hier ist die einfache Anwendung, die diesen einfachen Befehl verarbeiten.

CommandRouter(). Laufen ("Würfelwurf 3d4")

package com.kwoolytech.kwoolybot 

case class CommandRouter() { 

    def run(command: String): List[String] = { 
    val _command = command.split("\\s+").toList 

    commandArray.head match { 
     case "dice" => Dice.run(_command.tail) 
     case _ => List[] 
    } 
    } 
} 


package com.kwoolytech.kwoolybot 

case class Dice() extends Bot { 

    def run(command: List[String]): List[String] = { 
    command.head match { 
     case "roll" => roll(_command.tail) 
     case _ => List[] 
    } 
    } 

    private def roll(command: Array[String]): List[String] = { 
    val rollCmdPattern = "([0-9]+)d([0-9]+)".r 

    command.head match { 
     case rollCmdPattern(numTry, diceSize) => rollDice(numTry, diceSize) 
     case _ => List[] 
    } 
    } 

    private def rollDice(numTry: Int, diceSize: Int): List[String] = { 
    (1 to numTry).map { x => scala.util.Random.nextInt(diceSize) + 1}) 
    }.toList.map(_.toString) 

} 

Btw, auf den ersten Teil der Anwendung, ich will, eine Rückruffunktion übergehen, die erhalten wird aufgerufen, wenn der Würfel Bot seine Arbeit getan hat.

Dice.run (_command.tail, Rückruf)

Die Sache ist .. Ich bin nicht ganz sicher, was für die Rückruf Parameter zu übergehen. Wenn dies Java ist, werde ich eine Schnittstelle wie unten definieren, aber in Scala bin ich nicht wirklich sicher, was zu verwenden ist.

interface KwoolyHttpCallback { 
    void onWeatherJsonDataReceived(String result); 
    void onWeatherBitmapDataReceived(Bitmap result); 
} 

private void initializeKwoolyHttpCallbackFunction() { 
httpClientCallback = new KwoolyHttpCallback() { 
    @Override 
    public void onWeatherJsonDataReceived(String result) { 
     try { 
      dataModel.setWeatherJsonData(result); 
      queryWeatherBitmapData(); 
     } catch (Exception e) { 
      Log.e(getClass().getName(), "Exception: "); 
      e.printStackTrace(); 
     } 
    } 

Ich habe von irgendwo gehört, dass das Merkmal die Schnittstelle ist, aber ich verstehe es wirklich nicht.

trait BotInterface { 
    def onReceiveResult(result: List[String]): List[String] 
} 

Könnten Sie mir bitte beibringen, wie Sie das Merkmal als Callback-Schnittstelle verwenden?

Vielen Dank im Voraus! :)

Antwort

1

Wenn das, was Sie brauchen, ist ein Rückruf ein List[String] nehmen und eine List[String] Rückkehr, gibt es keine Notwendigkeit für eine Merkmal, können Sie eine Funktion benötigen:

def run(command: List[String], callback: List[String] => List[String]): List[String] 

Die callback ist ein mit wenig Syntax Zucker für die Definition. Es wird tatsächlich in einen Typ mit dem Namen Function1[List[String], List[String]] übersetzt.

Jetzt können Anrufer anonyme Funktion Syntax in einer Implementierung weitergeben müssen:

run(List("1","2","3"), l => { 
    l.foreach(println) 
    l 
}) 

Wir können auch durch die Verwendung eines Sekunden Parameterliste dieses ein wenig schöner machen (diese currying genannt wird):

def run(command: List[String])(callback: List[String] => List[String]): List[String] 

Und jetzt haben wir:

run(List("1","2","3")) { l => 
    l.foreach(println) 
    l 
} 

Wenn Sie immer noch davon überzeugt sind, dass Sie ein trait wollen, ist es eigentlich ziemlich ähnlich, wie Sie eine Schnittstelle in Java definieren würde:

trait BotInterface { 
    def onReceiveResult(result: List[String]): List[String] 
} 

def run(command: List[String], callback: BotInterface): List[String] 

Beachten Sie, dass Züge in Scala können Standardimplementierungen haben, ähnlich auf die Standardmethoden des Java 8:

trait BotInterface { 
    def onReceiveResult(result: List[String]): List[String] = result.map(_.toLowerCase) 
} 

Und in der run Definition Sie rufen müssen callback.onReceiveResult(list)

+1

Hey Yuval, ich weiß deine Hilfe zu schätzen. Ich denke, ich habe es verstanden. Vielen Dank! – Harry