在Clojure记录上创建可选字段?

Zub*_*air 11 clojure

当我实例化一个clojure记录时,如果我没有设置记录的所有字段,我会收到错误.如何指定某些字段是可选的?

小智 11

defrecord声明一个类型和一个构造函数,但该类型实现了clojure map接口.您只需要在声明中输入必填字段即可.例如,

(defrecord MyRecord [required1 required2])

(defn make-my-record [r1 r2 & [opt1 opt2]]
  (assoc (MyRecord. r1 r2) :optional1 opt1 :optional2 opt2))
Run Code Online (Sandbox Code Playgroud)

可以像,

user> (make-my-record 1 2)
#:user.MyRecord{:required1 1, :required2 2, :optional2 nil, :optional1 nil}
user> (make-my-record 1 2 :a :b)
#:user.MyRecord{:required1 1, :required2 2, :optional2 :b, :optional1 :a}
Run Code Online (Sandbox Code Playgroud)