Clojure - 为一个人定义数据结构

时间:2016-04-24 02:34:52

标签: vector data-structures struct clojure logic

在其他语言中,如何创建结构是非常不言自明的。你会如何在Clojure中做这样的事情?

例如,我想添加一个人的姓名,地址和电话号码(家庭和移动电话)。

我猜我想制作一个载体?

提前致谢!

2 个答案:

答案 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>
  )
}