2013-06-02 3 views
6

On "Programming Clojure", gibt es ein Beispiel get-Funktion auf einem Vektor mit:in Clojure, ist ein Vektor eine bestimmte hashmap?

(get [:a :b :c] 1) 
-> :b 

I (doc get) genannt, und es sieht aus wie Funktion als Argument nimmt hashmap erhalten, aber nicht Vektor, so dass ich wandern, wenn Vektor ist eine Art von hashmap. Ich erinnere mich an ein hashmap einen Index integer nehmen, und Rückgabewert, der Index übereinstimmt, so habe ich dies zu sehen, ob Vektor elbe tun können:

([1 2 3 4] 1) 
-> 2 

Es hat Rückgabewert 2, der am Index 1 in ist [ 1 2 3 4].

Bedeutet dies, dass ein Vektor eine Hashmap ist, deren Schlüssel-Wert-Paar Index-Wert-Paar ist?

+0

Mathematisch gesprochen ist ein Vektor eine * map * - eine Funktion (eine mathematische Funktion). Ich weiß nicht, wie es speziell in clojure implementiert wird, aber ich bezweifle, dass es mit einem Hash implementiert wird. clojure wird dynamisch typisiert, es ist also egal, was der tatsächliche Typ ist. – Elazar

Antwort

8

Nein, die zugrunde liegende Implementierung ist anders.

Nichtsdestoweniger, da logisch Vektoren Elemente Kartenindizes tun, sie sind assoziative Strukturen in Clojure und kann mit get, contains? und assoc verwendet werden (obwohl für assoc nur von 0 auf 1 über das Ende des Vektorindizes verwendet werden). Sie können jedoch nicht mit dissoc verwendet werden - das ist eine "echte Karten" -Operation.

Vektoren verhalten sich auch anders als Maps, wenn sie als Funktionen verwendet werden: Das Aufrufen einer Map als Funktion entspricht der Verwendung mit get, während das Aufrufen eines Vektors der Verwendung von nth entspricht. Der Unterschied ist, dass nth eine Exception für Index-Out-of-Bounds (sowie Argumente, die möglicherweise keine Indizes sein können, wie negative Zahlen oder Nicht-Nummern) auslöst, während getnil zurückgibt.

+0

Vielen Dank, sehr hilfreich! –

Verwandte Themen