Сериализировать карту ввода в строку - PullRequest
5 голосов
/ 13 июля 2011

Я пытаюсь написать общую функцию сериализации в clojure.Что-то вроде этого

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

Который при вызове

(serialize input-map ",") Produces 
Ashwani,Dev

На данный момент у меня есть кое-что, что требует определенных ключей карты, но делает это

(defn serialize [input-map]
  (map #(str (% :Name) "," (% :Title) "\n") input-map ) )

Чего я хочу избежать, так это жесткого имени и названия.Должен быть какой-то способ использовать рефлексию или что-то еще, чтобы выполнить это, но, к сожалению, я не знаю достаточно сомнений, чтобы это сделать.

Ответы [ 4 ]

6 голосов
/ 13 июля 2011
(defn serialize [m sep] (apply str (concat (interpose sep (vals m)) ["\n"])))
4 голосов
/ 13 июля 2011

Сделайте снимок:

(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 ",")

урожайность

"Ashwani,Dev\n"

Не уверен, насколько это идиоматично, но это должно работать для вас.

Обновление: Ответ Жюльена намного приятнее, чем мой!vals ... как я мог это пропустить:)

3 голосов
/ 07 ноября 2014

Это совсем просто.

(str input-map)
0 голосов
/ 13 июля 2011

«Нормальные» типы clojure могут быть сериализованы с использованием pr-str и восстановлены с использованием read-string. Если у вас нет причин форматировать ваши сериализованные данные особым способом, который вы описали, я бы предложил вместо этого использовать pr-str хотя бы потому, что его выходные данные более читабельны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...