Als neuer Clojure-Entwickler ist es leicht, Sammlungen und Sequenzen zu verwechseln.
Diese sortierten Vektorfunktion:
(sortiert [1 2 3 4 5 6]) => (1 2 3 4 5 6);
gibt eine Sequenz
Aber ich brauche einen Vektor für die nächste Operation, weil das nicht funktioniert ...
(take-while (teilweise> 3) (1 2 3 4 5 6))
=> ClassCastException java.lang.Long kann nicht in clojure.lang umgewandelt werden.IFn Benutzer/eval2251 (NO_SOURCE_FILE: 2136)
Lassen Sie uns versuchen, die Sequenz in einen Vektor zu konvertieren:
(VEC (1 2 3 4 5 6))
=> Classcast java.lang. Long kann nicht in clojure.lang.IFn umgewandelt werden clijure.lang.IFn user/eval2253 (NO_SOURCE_FILE: 2139)
Nein! Aber wenn Sie alles zusammenfügen, funktioniert es gut.
(take-while (teilweise> 3) (sortiert [1 2 3 4 5 6]))
=> (1 2)
Die Lektion: Sie können nicht direkt mit Sequenzen arbeiten! Sie sind ein Zwischenschritt in diesem Prozess. Wenn die REPL versucht (1 2 3 4 5 6) zu bewerten, sieht es aa Funktion und löst eine Ausnahme:
(1 2 3 4 5 6) => Classcast java.lang.Long nicht gegossen werden clojure.lang.IFn user/eval2263 (NO_SOURCE_FILE: 2146)
Schön. Jetzt ist es leicht zu sehen, dass das Ausführen von (vec) auf sortierten Vektoren 4 Mal langsamer ist als das Sortieren von direkten Arrays! Die zufällige Zugriffszeit ist sowohl im Vektor als auch im Array so schnell, dass die 40% egal sind, denke ich. – GabiMe