【问题标题】:Dynamic vector/list creation动态向量/列表创建
【发布时间】:2017-07-18 01:59:06
【问题描述】:

我是 Clojure 的新手,我想动态构建一个向量/列表。

我已经构建了这个函数generate-map,它返回一个map,比如:

{:key 1, :value 1, :other [...]}

在另一个函数get-statement 中,我有一个doseq 调用这个generate-map 函数。

(defn get-statement
  [st] 
  (doseq [s st] (generate-map s)))

我想构建一张地图,通过doseq 调用加入所有这些generate-maps 返回,例如:

[{:key 1, :value 1, :other [...]}
 {:key 2, :value 2, :other [...]}
 {:key 3, :value 3, :other [...]}]

我该怎么做?谢谢!

【问题讨论】:

  • 1.不要使用doseq,因为您需要结果。使用for。 2.查找into函数。 (into {}...)。我会发布答案,但我正在上班:/
  • 3.您要创建的结果看起来是非法的;地图需要是键/值对。你的意思是你想要一个地图矢量?
  • 谢谢!它工作:)
  • Np。检查我刚刚发布的答案。它详细阐述了这些主题。
  • 注意,我在你接受之前更新了答案,所以我不确定你是否看到了编辑。有一个比使用for 短得多的版本。显然我累了。不知道为什么我的思绪立即跳到(into [] (for ...))mapv 几乎绝对是适合这里工作的工具,除非您需要某种过滤。

标签: clojure


【解决方案1】:

如果您想创建一些地图并将它们放入矢量中,只需使用for,与vec(into [] ...) 混合使用:

(into [] ; ... and place them in a vector
  (for [d data] ; ...for each datum in data...
    (generate-map d))) ; Generate a map...

mapv:

(mapv generate-map data) ; Super succinct!

切勿将doseq 用于此类事情。 doseq 不返回任何内容,因此您必须使用一些 atom 或其他效果混乱才能真正摆脱循环。

  • 当您需要执行副作用并且不直接需要任何结果时使用doseq

  • 如果您需要循环后的结果,请使用formapreduce(或任何其他功能性循环结构)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2018-09-05
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多