2016-04-24 5 views
3

他の言語では、構造体の作成方法はかなり自明です。 Clojureではどうやってこのようなことをしますか?Clojure - Personのデータ構造を定義する

たとえば、人の姓名、住所、電話番号(自宅と携帯)を追加したいとします。

私はベクトルを作りたいと思っていますか?

ありがとうございます! Clojureので

答えて

7

は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のレコードはかなり醜いです。

+0

実際、電話機はオプション3の「醜い」側に少しあります。最初のオプションは非常に簡単ですが、ネストされたオプションは多分私が望むもののほんの一部です。これは非常にきれいで簡潔に見えます。すべてをテーブルのような形式に保ちます。こうすることで、すべての種類のデータを一度にドラッグすることができます。個人情報、住所、電話などを意味します。 ありがとうございます - 私はあなたの非常にクリアな精緻化に非常に感謝します。 – FoxDonut

2

は、その「記録」と呼ばれ、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" 
関連する問題