将输入映射序列化为字符串

Ash*_*Ash 5 clojure

我正在尝试在clojure中编写一个通用的serilization函数.像这样的东西

(def input-map {:Name "Ashwani" :Title "Dev"})
(defn serialize [input-map delimiter]
...rest of the code
)
Run Code Online (Sandbox Code Playgroud)

哪个叫

(serialize input-map ",") Produces 
Ashwani,Dev
Run Code Online (Sandbox Code Playgroud)

我现在有一些东西,需要地图的特定键,但这样做

(defn serialize [input-map]
  (map #(str (% :Name) "," (% :Title) "\n") input-map ) )
Run Code Online (Sandbox Code Playgroud)

我想要避免的是那里的硬编码名称和标题.必须有一些方法来使用反射或某些东西来实现这一点,但不幸的是我不知道足够的clojure来完成这件事.

Jul*_*ang 6

(defn serialize [m sep] (apply str (concat (interpose sep (vals m)) ["\n"])))
Run Code Online (Sandbox Code Playgroud)


ove*_*ink 5

试一试:

(require 'clojure.string)
(defn serialize [m sep] (str (clojure.string/join sep (map (fn [[_ v]] v) m)) "\n"))
(def input-map {:Name "Ashwani" :Title "Dev"})
(serialize input-map ",")
Run Code Online (Sandbox Code Playgroud)

产量

"Ashwani,Dev\n"
Run Code Online (Sandbox Code Playgroud)

不确定这有多惯用,但它应该对你有用。

更新: 朱利安的答案比我的好得多! vals...我怎么能错过呢:)