我对Clojure和函数式编程不熟悉,现在遇到了问题。我得到了这样的数据结构:
{
:service1 \a
:service2 \b
:service3 \c
:default \d
:alert-a {
:duration "00:00-23:59"
:if-alert true
:continuous-times 2
:time-interval [2 6 9 15 30 60]
:times -1
}
:alert-b {
:duration "09:00-23:00"
:if-alert true
:continuous-times 2
:time-interval [2 6 9 15 30 60]
:times -1
}
:alert-c {
:duration "00:00-23:59"
:if-alert true
:continuous-times 5
:time-interval [5]
:times 1
}
:alert-d {
:duration "00:00-23:59"
:if-alert true
:continuous-times 5
:time-interval [5 15 30 60]
:times -1
}
}
这是从配置文件中读取的内容。我想使用将所有:duration
值更改为DateTime对象clj-time
。所以我可以得到类似:
{
:service1 \a
:service2 \b
:service3 \c
:default \d
:alert-a {
:duration DateTime Object
:if-alert true
:continuous-times 2
:time-interval [2 6 9 15 30 60]
:times -1
}
:alert-b {
:duration DateTime Object
:if-alert true
:continuous-times 2
:time-interval [2 6 9 15 30 60]
:times -1
}
:alert-c {
:duration DateTime Object
:if-alert true
:continuous-times 5
:time-interval [5]
:times 1
}
:alert-d {
:duration DateTime Object
:if-alert true
:continuous-times 5
:time-interval [5 15 30 60]
:times -1
}
}
但是数据结构是不可变的。在其他语言中,这是一个容易解决的问题,但是现在整个下午我都不知道该怎么办。
那么有人可以给我一些建议吗?我是否使用了错误的数据结构?或者,可以通过功能方式以某种方式解决此问题。
尽管您正在使用不可变的数据结构,但是可以轻松高效地返回基于原始数据的新数据结构。
在这种情况下,最简单(如果重复)的解决方案是:
(-> m
(update-in [:alert-a :duration] parse-duration)
(update-in [:alert-b :duration] parse-duration)
(update-in [:alert-c :duration] parse-duration)
(update-in [:alert-d :duration] parse-duration))
在这里要意识到的重要一点是,update-in
不会改变正在处理的数据结构。而是返回应用了修改的新数据结构。
线程宏->
允许通过update-in
操作对新数据结构进行线程处理,以便最终返回的值是应用了所有更新的原始数据结构。
解析持续时间函数可能看起来像这样:
(defn parse-duration
"Convert duration in HH:MM-HH:MM format"
[s]
(let [[t1 t2] (clojure.string/split s #"-"))
(Period. (clj-time.coerce/to-date-time t1)
(clj-time.coerce/to-date-time t2)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句