在其他語言中,如何創建一個結構是非常明顯的。你如何在Clojure中做這樣的事情?Clojure - 爲某人定義數據結構
例如,我想添加一個人的姓名,地址和電話號碼(家庭和手機)。
我猜我想做一個向量?
在此先感謝!
在其他語言中,如何創建一個結構是非常明顯的。你如何在Clojure中做這樣的事情?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"}
或者嵌套一個:
{: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"})})
在這種情況下,然而,你可能想只用一張地圖去。記錄,特別是,相當難看。
Clojure中它被稱爲「記錄」,並使用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的「醜陋」一面。第一個選項是偉大的,因爲它非常簡單,但嵌套選項可能是我想要的更多一點。這看起來非常乾淨簡潔 - 將所有內容都保存爲幾乎像表格一樣的格式。這樣我就可以一次拖出所有特定類型的數據......我的意思是個人信息,地址和電話。 非常感謝你 - 我非常感謝你的EXTREMELY CLEAR闡述。 – FoxDonut