在其他语言中,如何创建结构是非常不言自明的。你会如何在Clojure中做这样的事情?
例如,我想添加一个人的姓名,地址和电话号码(家庭和移动电话)。
我猜我想制作一个载体?
提前致谢!
答案 0 :(得分:6)
在Clojure中,您通常会使用地图来表示该类数据。你可以使用平面地图:
library(data.table)
setDT(df1)[, paste(c("T", "V"), "next", sep="_") := lapply(.SD, max),
by = .(shift(rleid(Value), fill = 1))][.N, c("T_next", "V_next") := rep(list(NA),2)][]
# Time Value T_next V_next
#1: 1 10 4 4
#2: 2 10 4 4
#3: 3 10 4 4
#4: 4 15 4 4
#5: 5 15 6 6
#6: 6 20 NA NA
或嵌套的:
{: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"}
如果您的数据具有或多或少的静态架构并且您想要使用Clojure's polymorphic features,则可以使用records:
{: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"}}
但是,在这种情况下,您可能只想使用地图。特别是(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"})})
记录非常难看。
答案 1 :(得分:1)
在clojure中,它被称为“记录”,并使用defrecord定义: 来自文档:
const VideoList = (props) => {
const videoItems = props.videos.map((video) => {
return (
// want to render list-item component
<ListItem key={video.etag} video={video} />
)
});
return (
<ul className="list-group">
{videoItems}
</ul>
)
}