【问题标题】:Mutating Java object by using side-effecting method in a loop in Clojure通过在 Clojure 的循环中使用副作用方法来改变 Java 对象
【发布时间】:2013-09-21 00:07:46
【问题描述】:

在我的 Clojure 代码中,我想在循环中使用 Java 对象的副作用方法。我的意图是将 Java 对象的多个参数设置为我存储在地图中的值:

(def params {
             :param1 "value1"
             :param2 "value2"
             })

如果我直接将param1 设置为"value1",它可以正常工作:

(.setParam object (str :param1) "value1")

但是,如果我想迭代 params 映射以强制使用 doseq 进行评估,Java 对象保持不变:

(doseq [[param value] params] (.setParam object (str param) value))

如何循环 params 映射并使用副作用 setParam 方法,以使 Java object 发生变异?

我相信这可能是一个初学者错误,对于更有经验的 Clojure 用户来说很容易解决。

【问题讨论】:

    标签: java clojure lazy-evaluation


    【解决方案1】:

    它应该可以工作,我认为你做错了什么。

    user=> (def m (java.util.HashMap.))
    #'user/m
    user=> (doseq [[p v] params] (.put m p v))
    nil
    user=> m
    {:param2 "value2", :param1 "value1"}
    

    【讨论】:

    • 啊,是的,可能没有 Java 对象需要在参数名称中使用冒号 :)。
    • 没错,那是我的遗漏。
    【解决方案2】:

    对关键字调用str 会在结果中包含冒号。改用name

    (doseq [[param value] params] (.setParam object (name param) value))
    

    【讨论】:

    • 确实,这是.setParam 调用不起作用的真正原因。正如我所怀疑的那样,它与doseq 的强制突变无关。顺便说一句,既然我们已经发现了错误的正确来源,我应该关闭还是删除我的问题? StackOverflow 上此类问题的常用方法是什么?
    • 我会说让它保持打开状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多