我有一个变量“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” 所以我的问题是,如何正确设置字符串值,假设这是我做错了。
答案 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
您应该考虑将该值用于什么,而不是考虑如何为变量赋值。