【发布时间】:2020-02-29 13:30:34
【问题描述】:
我在 let 中有以下代码
; clause in a let
lessons-full (into []
(map #(dissoc (merge % (first (lesson-detail %)))
:id :series_id :lesson_id :num))
lessons)
奇怪的是,我意外地使用了 into 的转换器形式,因为在错误的地方得到了一个括号。就是上面显示的版本。为了比较,没有传感器的版本是:
; clause in a let
lessons-full (into []
(map #(dissoc (merge % (first (lesson-detail %)))
:id :series_id :lesson_id :num)
lessons))
这也有效。
在此转换中我还有几件事要做,包括将名为:type 的键的值转换为keyword,该键当前是一个字符串。然而,这正在成为高认知负荷。
还不熟悉线程操作符。任何人都可以协助第一步/思考过程吗?
lessons 是来自 jdbc 查询的映射列表。
更新:草稿答案 - 转换为线程最后运算符的思考过程
第 1 步
准备杂耍。 1. 从线程最后一个->> 开始, 2. 将参数lessons 放在前面, 3. 将最终转换into 放在最后。此版本有效,但我们还没有完成:
; clause in a let
lessons-full (->> lessons
(map #(dissoc (merge % (first (lesson-detail %)))
:id :series_id :lesson_id :num) ,,,)
(into [] ,,,))
请注意,triple commas ,,, 被 clojure 忽略,我们添加它们以帮助可视化最后线程 ->> 宏注入参数的位置。
第 2 步
我们提取了dissoc,但由于我们在对map 的调用中使用了它,所以当我们将其提取出来时,我们需要将它包装在对map 的另一个调用中。
; clause in a let
lessons-full (->> lessons
(map #(merge % (first (lesson-detail %))) ,,,)
(map #(dissoc % :id :series_id :lesson_id :num) ,,,)
(into [] ,,,))
所以这也有效。让它沉入水中。
更新 2
最后,这是实现我最初目标的代码:
; clause in a let
lessons-full (->> lessons
(map #(merge % (lesson-detail %)) ,,,)
(map #(dissoc % :id :series_id :lesson_id :num) ,,,)
(map #(assoc % :type (keyword (:type %))) ,,,)
(into [] ,,,))
看来list comps 在线程最后一个宏内部并不容易使用,除非我弄错了。另外,我在这里映射了三遍地图。在我当前的用例中,这可能无关紧要,但这里有什么关于性能或任何其他可能的改进的内容吗?
【问题讨论】:
-
如果您已经在使用传感器,而不是对线程“满意”,为什么不继续使用传感器和
comp到您的第一个版本? -
@cfrick 我尝试了
comp,但没有成功。如果您想发布一个示例,那就太好了:) -
您能举例说明您的输入和期望的输出吗?
标签: clojure