他の言語では、構造体の作成方法はかなり自明です。 Clojureではどうやってこのようなことをしますか?Clojure - Personのデータ構造を定義する
たとえば、人の姓名、住所、電話番号(自宅と携帯)を追加したいとします。
私はベクトルを作りたいと思っていますか?
ありがとうございます! Clojureので
他の言語では、構造体の作成方法はかなり自明です。 Clojureではどうやってこのようなことをしますか?Clojure - Personのデータ構造を定義する
たとえば、人の姓名、住所、電話番号(自宅と携帯)を追加したいとします。
私はベクトルを作りたいと思っていますか?
ありがとうございます! Clojureので
はClojureのでは、通常、データの並べ替えを表現するためにマップを使用します。あなたはフラットなマップを使用することができます。
{:first-name "Jeremy"
:last-name "Martinson"
:street "455 Larkspur Dr."
:city "Baviera"
:state "California"
:zip 22611
:home-phone "(555) 555-5555"
:mobile-phone "(666) 666-6666"}
またはネストされた1:
{:name {:first "Jeremy"
:last "Martinson"}
:address {:street "455 Larkspur Dr."
:city "Baviera"
:state "California"
:zip 22611}
:phones {:home "(555) 555-5555"
:mobile "(666) 666-6666"}}
あなたのデータは、多かれ少なかれ静的なスキーマを持っており、あなたがClojure's polymorphic featuresを利用したい場合は、あなたが使用することができますrecords:この場合
(defrecord Name [first last])
(defrecord Address [street city state zip])
(defrecord Phones [home mobile])
(defrecord Person [name address phones])
(map->Person
{:name (map->Name
{:first "Jeremy"
:last "Martinson"})
:address (map->Address
{:street "455 Larkspur Dr."
:city "Baviera"
:state "California"
:zip 22611})
:phones (map->Phones
{:home "(555) 555-5555"
:mobile "(666) 666-6666"})})
は、しかし、あなたはおそらくちょうどマップと一緒に行きたいと思います。特にPhones
のレコードはかなり醜いです。
は、その「記録」と呼ばれ、defrecordを使用して定義されます。ドキュメントから :
(defrecord Person [fname lname address])
-> user.Person
(defrecord Address [street city state zip])
-> user.Address
(def stu (Person. "Stu" "Halloway"
(Address. "200 N Mangum"
"Durham"
"NC"
27701)))
-> #'user/stu
(:lname stu)
-> "Halloway"
(-> stu :address :city)
-> "Durham"
実際、電話機はオプション3の「醜い」側に少しあります。最初のオプションは非常に簡単ですが、ネストされたオプションは多分私が望むもののほんの一部です。これは非常にきれいで簡潔に見えます。すべてをテーブルのような形式に保ちます。こうすることで、すべての種類のデータを一度にドラッグすることができます。個人情報、住所、電話などを意味します。 ありがとうございます - 私はあなたの非常にクリアな精緻化に非常に感謝します。 – FoxDonut