2017-10-31 1 views
0

변수 "testtext"가 있습니다. 다른 변수 "testvalue"에 따라 항상 1 또는 2 값이 설정되므로 무언가로 설정해야합니다. testvalue가 1이면 testtext를 "its one"으로 설정해야합니다. 그리고 testvalue가 2 일 때 testtext를 "its two"로 설정해야합니다. 지금 내가 가진 : "문자열 clojure.lang.Var 캐스트 할 수없는"Clojure 문자열 값 설정

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

하지만 난이 오류가 그래서 제 질문은, 내가 제대로 문자열 값을 설정하는 방법, 그 가정은 내가 무슨 짓을했는지됩니다 잘못된.

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

var-set이 Clojure의 매우 드문 사용 :

답변

3

는이 같은 더 뭔가를 원한다. 정확한 유스 케이스를 모른 채 너무 자세히 설명 할 수는 없습니다.

당신이 정말로 자바 변수처럼 뭔가를해야 할 경우, 당신은 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)) 
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 폼하자 당신이 바르에 값을 할당 . 함수에 그것을 두는 것은 결과를 반환하는 편리한 방법입니다.

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 

을 그 값을 사용하고 싶은 것이 무엇인지 생각해보십시오.