3 Stimmen

Die Unveränderlichkeit des Codes bewahren

Ich kann nicht herausfinden, wie ich den folgenden Code unveränderlich machen kann:

def function123(str: String, mapVal: Map[String, String]) = {
    var str1 = str
    mapVal.keySet.foreach({x => 
       str1 = str1.replaceAll(/*some pattern involving x*/, mapVal.get(x).get)})
    str1
}

Ich vermute, dass ich foldLeft oder eine verschachtelte Methode mit Parameter-Akkumulator verwenden würde, aber das sind nur meine Gedanken.

Also wie mache ich das?

5voto

senia Punkte 37585

foldLeft

Hier haben Sie eine Schleife.

Die unveränderliche Version der Schleife mit Seiteneffekten ist foldLeft mit allen Seiteneffekten, die durch die Erstellung des nächsten Zustands ersetzt wurden:

val result = mapVal.foldLeft(str){case (state, (key, value)) => 
  state.replaceAll(/*ein Muster, das den Schlüssel betrifft*/, value)
}

Um in einer unveränderlichen Umgebung zu arbeiten, sollte jede Iteration der Schleife einen Wert zurückgeben und den Resultat der vorherigen Iteration als Parameter entgegennehmen. Genau das ist foldLeft.

Rekursion

Die andere Lösung ist eine rekursive Methode. Sie sollten die Schleifeniteration in eine Methode extrahieren und diese Methode zur Aufruf der nächsten Iteration am Ende machen:

def function123(str: String, mapVal: Map[String, String]) = {
  @tailrec def loop(state: String, pairs: List[(String, String)]): String = pairs match {
    case Nil => state
    case (key, value) :: tail =>
      val nextState = state.replaceAll(/*ein Muster, das den Schlüssel betrifft*/, value)
      loop(nextState, tail)
  }
  loop(str, mapVal.toList)
}

Veränderliche Schleife -> unveränderlich

Um Code mit einer veränderlichen Schleife unveränderlich zu machen, sollten Sie alle Werte, die implizit in Änderungen innerhalb der Schleife involviert sind, in irgendeiner Art von Zustand extrahieren (einziger Zustandsobjekt für foldLeft oder Bündel von Parametern für rekursive Methode) und dann am Ende jeder Iteration einen neuen Zustand basierend auf dem vorherigen erzeugen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X