destructuring to przydatna funkcja umożliwiająca która umożliwia lokalne powiązania (nie zmienne!), Aby łatwo tworzyć przez rozebranie złożonych struktur danych (SEQ-Ables jak wektorami lub associatives jak hash-map), jak to jest opisany here.
Take następujący przykład:
(let [v [1 2 3 4 5 6]
v_0 (first v)
v_1 (nth v 1)
v_rest (drop 2 v)
m {:a 1 :b 2}
m_a (get m :a)
m_b (get m :b)
m_default (get m :c "DEFAULT")]
(println v, v_0, v_1, v_rest, m, m_a, m_b, m_default))
Następnie powyższy kod można uprościć stosując wiązania rozpad jak następuje:
(let [[v_0 v_1 & v_rest :as v]
[1 2 3 4 5 6]
{m_a :a m_b :b m_default :c :or {m_default "DEFAULT"} :as m}
{:a 1 :b 2}]
(println v, v_0, v_1, v_rest, m, m_a, m_b, m_default))
stanie rozpad może być stosowany w let
wiązania i parametrów funkcyjnych (fn
, defn
, letfn
itd.), A także w makrach, aby zwrócić wiązania let
zawierające takie wzorce destrukturyzacji.
Jednym z ważnych zastosowań, o którym należy pamiętać, są makra if-let
i when-let
. Oświadczenie if
zawsze jest oceniana na całej postaci, nawet jeśli destrukturyzowaną sami ocenić na nil
Wiązania:
(if-let [{:keys [a b]}
{:c 1 :d 2}]
(println a b)
(println "Not this one"))
Jestem z Java tle, to jest jak tworzenie nowej zmiennej opartej na starych zmiennych? – sriram
Nie znam dobrze języka Java, ale nie sądzę, że ma coś takiego. Nie tworzy nowych zmiennych, to tylko cukier syntaktyczny do wiązania wielu zmiennych naraz z różnych części innej zmiennej. – Barmar
Zobacz zaktualizowaną odpowiedź, pokazującą, co jest równoważne. – Barmar