Clojure设置字符串值

时间:2017-10-31 18:58:54

标签: clojure

我有一个变量“testtext”。 根据另一个变量“testvalue”,即值1或2,它需要设置为某个值。 因此,如果testvalue为1,我需要将testtext设置为“its one”。 当testvalue为2时,我需要将testtext设置为“它的两个”。 现在我有:

 (cond
        (= testvalue 1) (var-set testtext "its one")
        (= testvalue 2) (var-set testtext "its two")
        :else (var-set testtext "ERROR")
        )

但我收到错误“String无法转换为clojure.lang.Var” 所以我的问题是,如何正确设置字符串值,假设这是我做错了。

3 个答案:

答案 0 :(得分:3)

你想要更像这样的东西:

 (let [result (cond
                (= testvalue 1) "its one"
                (= testvalue 2) "its two"
                :else "ERROR"  ) ]
   (println "result:" result))

在Clojure中使用var-set是非常罕见的。在不知道确切用例的情况下,我无法更详细地回答。

如果你确实需要类似Java变量的东西,你可以使用Clojure atom

 (def result (atom nil))
 (cond
   (= testvalue 1) (reset! result "its one")
   (= testvalue 2) (reset! result "its two")
   :else (reset! result "ERROR" ))
 (println "result:" @result))

答案 1 :(得分:0)

您可能需要以下内容:

(defn func 
  [test-value]
  (let [test-var (cond
                 (= test-value 1) "it's one"
                 (= test-value 2) "it's two"
                 :else "ERROR")]
    test-var))
=> #'user/func
(func 1)
=> "it's one"
(func 2)
=> "it's two"
(func 3)
=> "ERROR"

let表单允许您为vars分配值。将它粘贴在函数中是返回结果的便捷方式。

答案 2 :(得分:0)

在大多数情况下,您不想修改现有的"变量""值,而是使用let将值绑定到符号。如果我们知道更大的图片会更容易回答,但正如已经提到的那样atom是一种数据类型,您可以在其中以原子方式交换新值。

我说这是更惯用的,虽然不是你问的那样:

(def lookup-table
  {1 "its one"
   2 "its two"})

(defn make-lookup [i]
  (get lookup-table i "ERROR"))

(doseq [i (range 4)]
  (println i "=" (make-lookup i)))

打印:

0 = ERROR
1 = its one
2 = its two
3 = ERROR

您应该考虑将该值用于什么,而不是考虑如何为变量赋值。