在其他语言中,如何创建一个结构是非常明显的。你如何在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