【问题标题】:appending values in a global map in clojure在 clojure 的全局映射中附加值
【发布时间】:2016-07-05 06:45:48
【问题描述】:

我在 clojure 中使用

声明了一个地图
             (def finalMap {})

我在使用 assoc 的函数内将值附加到它,但它们没有附加,映射保持为空。我认为这是由于不可变性,我能否以某种方式使全局映射可变。该函数是递归函数,每次调用该函数时我都会附加值。

          (defn func [arg1 arg2]
            ;(map append inside let)
            (dorun (for [i (range 0 index)]
              (do
                (func(arg1 arg2))))))

你能帮我用正确的方法吗?

【问题讨论】:

  • 解决方案是使用答案中提出的atom。更重要的是你的最终目标是什么?您能否提供该函数将在其中使用的上下文?也许有更好的解决方案,不涉及可变数据。
  • 顺便说一句:(dorun (for [i (range 0 index)] ... 可以缩短为 (dotimes [i index] ... ,而 dorun 内部的 do 已过时,因为 do* 宏的主体在隐式 do 中进行评估块。
  • 其实我刚开始使用 clojure 并且正在将 java 代码转换为 clojure。我以与在 java 中相同的方式实现了此功能。显然,clojure 中必须有一种方法可以在不使用可变映射的情况下做到这一点。

标签: clojure


【解决方案1】:

如果你想要一个可变映射,那么你应该创建一个原子:

(def final-map (atom {})) 

通常你也会使用assoc 来添加更多的键值对。但是,您需要使用swap! 才能调用assoc

(swap! final-map assoc :a "a value")

这将添加一个键/值对,其中键是关键字:a,值是字符串“a value”。

查看其他examples of using assoc 可能会很好。请注意,在上面的代码中,assoc 的第一个参数是final-map 值,并返回final-map 值。

【讨论】:

  • 是的,谢谢。我使用 ref 做了同样的事情。它现在正在工作。
  • 你可以用一个原子编写整个应用程序。如果您只有一个,则无需使用 ref:请参阅here - 并意识到作者不需要使用两个原子 - 他/她可以将原子作为具有两个键/值对的映射。
  • 哦,我会调查的。谢谢。
  • 当你想多次做某事时,要考虑的另一件事是总是到达map(看起来你已经尝试过了)。考虑(map inc (range 10))
猜你喜欢
  • 2015-08-02
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
相关资源
最近更新 更多