Clojure-destructuring

提供:Dev Guides
移動先:案内検索

Clojure-破壊

*Destructuring* はClojure内の機能であり、データ構造を明示的に走査することなく、ベクターなどのデータ構造から値を抽出し、シンボルにバインドできます。

破壊の正確な意味と、それがどのように発生するかを見てみましょう。

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (def my-vector [1 2 3 4])
   (let [[a b c d] my-vector]
   (println a b c d)))
(Example)

上記のプログラムは、次の出力を生成します。

出力

1 2 3 4

上記の例では、次のことに注意してください-

  • 整数のベクトルを1、2、3、4として定義しています。
  • 次に、 ’let’ ステートメントを使用して、4つの変数(a、b、c、およびd)をmy-vector変数に直接割り当てます。
  • 4つの変数に対して 'println' ステートメントを実行すると、それぞれがベクトルの値に既に割り当てられていることがわかります。

そのため、clojureは、「let」ステートメントを使用して割り当てられたときに4つの値を持つmy-vector変数を非構造化しました。 分解された4つの値は、それに応じて4つのパラメーターに割り当てられました。

割り当てることができる対応する値を持たない余分な変数がある場合は、nilの値が割り当てられます。 次の例は、この点を明確にします。

(ns clojure.examples.hello
   (:gen-class))
(defn Example []
   (def my-vector [1 2 3 4])
   (let [[a b c d e] my-vector]
   (println a b c d e)))
(Example)

上記のプログラムは、次の出力を生成します。 出力から、最後の変数 'e’にはベクトルに対応する値がないため、nilであることがわかります。

出力

1 2 3 4 nil

残り

「残り」変数は、変数に割り当てられない残りの値を格納するために使用されます。

これがどのように使用されるかの例は、次のプログラムに示されています。

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (def my-vector [1 2 3 4])
   (let [[a b & the-rest] my-vector]
   (println a b the-rest)))
(Example)

上記のプログラムは、次の出力を生成します。 出力から、3と4の値を変数に割り当てることができないため、「the-rest」変数に割り当てられていることが明確にわかります。

出力

1 2 (3 4)

マップの破壊

ベクトルと同様に、マップも非構造化できます。 以下は、これを実現する方法の例です。

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (def my-map {"a" 1 "b" 2})
   (let [{a "a" b "b"} my-map]
   (println a b)))
(Example)

上記のプログラムは、次の出力を生成します。 プログラムから、「a」と「b」のマップ値がaとbの変数に割り当てられていることが明確にわかります。

出力

1 2

同様に、ベクトルの場合、破壊が発生したときにマップに対応する値がない場合、変数にはnilの値が割り当てられます。

以下はその一例です。

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (def my-map {"a" 1 "b" 2})
   (let [{a "a" b "b" c "c"} my-map]
   (println a b c)))
(Example)

上記のプログラムは、次の出力を生成します。

出力

1 2 nil