Comprendo che elenchi e vettori in Clojure possono essere utilizzati quasi in modo intercambiabile nella maggior parte delle situazioni. Ecco un caso semplice che miOttieni elemento da sequenza in clojure
(nth [2 4] 0) ;=> 2
(nth '(2 4) 0) ;=> 2
(get [2 4] 0) ;=> 2
(get '(2 4) 0) ;=> nil -- wtf???
sorprese La documentazione di get
colloqui mappatura di una chiave, ma funziona con vettori o insiemi bene. La documentazione di nth
menziona anche get
, parlando delle loro differenze solo in casi limite.
La situazione del mondo reale in cui ho affrontato questo strano comportamento era che ho caricato un file yaml. Ne risultò una struttura annidata di mappe ed elenchi. Volevo accedere a un elemento con get-in
.
(def form (parse-yaml some-yaml-file))
(def best-friend (get-in form [:friends 0 :first-name]))
Non funziona, perché get-in
usa get
internamente. Così ho una questione pratica una parte teorica e:
- È questo comportamento di
get
considerata corretta e si aspettava? Se è così, per favore, spiega perché. - Come posso accedere a un elemento nidificato in una tale struttura di mappe ed elenchi?
+1 per la versione filettata, non ho pensato di esso –