2017-10-31 4 views
0

私は変数 "testtext"を持っています。 他の変数 "testvalue"によっては、常に値1または2であるため、何かに設定する必要があります。 testvalueが1なら、私はtesttextを "その1"に設定する必要があります。 testvalueが2のとき、私はtesttextを "その2"に設定する必要があります。だから私の質問は、私は適切にそれは私がやったことだと仮定すると、文字列値を設定するのですか、であるClojureの文字列の値を設定します。

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

をしかし、私はエラー 「文字列がclojure.lang.Varにキャストすることはできません」を取得: は、今私が持っています違う。

答えて

3

あなたはより多くのこのような何かしたい:var-setを使用して

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

はClojureの中で非常にまれですが。あなたの正確なユースケースを知らなくても、私はあまり詳細に答えられません。

あなたが本当にJavaの変数のようなものが必要な場合は、Clojureの​​を使用することができます:あなたはおそらく何かしたい

(def result (atom nil)) 
(cond 
    (= testvalue 1) (reset! result "its one") 
    (= testvalue 2) (reset! result "its two") 
    :else (reset! result "ERROR")) 
(println "result:" @result)) 
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に値を割り当てます。それを関数に張り付けることは結果を返す便利な方法です。

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 

をその価値を何に使用したいか考えてみてください。

関連する問題