ListBuffer
könnte effizient ein Element an sein Ende anhängen und dann in eine List
konvertiert werden.Ein Anfängerpuzzle über den Quellcode von + = Methode der ListBuffer-Klasse in Scala
Ich studierte den Quellcode von ListBuffer
Append-Methode (+=
), aber es war schwierig zu verstehen, seine Funktionsweise. Der detaillierte Quellcode ist here.
excerpted Ein Quellcode:
final class ListBuffer[A] extends AbstractBuffer[A] {
private var start: List[A] = Nil
private var last0: ::[A] = _
private var exported: Boolean = false
private var len = 0
def += (x: A): this.type = {
if (exported) copy()
if (isEmpty) {
last0 = new :: (x, Nil)
start = last0
} else {
val last1 = last0 // last1 is a local variable, is it necessary here?
last0 = new :: (x, Nil)
last1.tl = last0 //
}
len += 1
this
}
}
Im else
Teil eine lokale Variable last1
definiert und anschließend mehrere Elemente am Ende enthalten, konstruiert. Die last0
zeigt immer auf die letzte Zelle.
Also ist last1
hier notwendig? Nach dem Blockieren wird es nicht mehr verfügbar sein. Ich kann nicht verstehen, warum der Autor last1
hier definieren muss.
Danke. Immer noch verwirrend. Warum "brauchen wir eine temporäre Variable, um das neu erstellte letzte Element zu halten"? 'last0 = new :: (x, Nil)' würde die letzte Zelle in einem Klassenfeld von 'last0' speichern. Aber 'last1' ist nur eine lokale Variable, sie verschwindet nach dem' else' Codeblock. – Spring
Es ist nicht genug, 'last0' zu bewegen; Sie brauchen auch das "tl" des jetzt-vorletzten Elements, um auf das soeben erstellte Element zu zeigen. Also 'last0.tl = neu :: (x, Nil); last0 = last0.tl 'würde es gut machen, wenn Sie 'tl' anstelle von' last1' verwenden. Die Wahl zwischen den beiden ist eine Frage von Geschmacks- und/oder Leistungstests. – alf
Ich fand diese Implementierung von '+ =' Methode hat ein Problem. Die angehängten Elemente konnten nicht in der Startliste gespeichert werden. Hier ist eine Ausführungsdemo: (1) 'val t = new ListBuffer [Int]'; (2) "t + = 1" // {'start = Liste (1)', 'last0 = Liste (1)'}; (3) "t + = 2"; {'start = Liste (1)', 'last0 = Liste (1)'} (4) 't.toList' {' Liste (1) '}. – Spring