2012-04-16 3 views
3

아마 분명하지만 (http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify)에서이 코드 제공 :구체화, ToString

(defn reify-str [] 
    (let [f "foo"] 
    (reify Object 
     (ToString [this] f)))) 

(defn -main [& args] 
    (println (reify-str)) 
    (System.Console/ReadLine)) 

왜 내가이 출력 무엇입니까? 도움이된다면 내가 Windows에서 ClojureCLR를 실행 해요

foo 

대신의

#<ui$reify_str$reify__4722__4727 foo> 

. 감사!

+0

다음과 같이 표시됩니다. http://stackoverflow.com/questions/5306015/javas-tostring-for-clojure-functions는 관련이 있습니다. – sw1nn

답변

5

기본 문제는 Clojure REPL이 이 아니라 .toString을 사용한다는 것입니다. 귀하의 유형에 대해 print-method을 정의해야합니다. 구체화 된 유형의 경우 좀 더 장황하게 만듭니다.

(defn reify-str [] 
    (let [f "foo" 
     r (reify Object 
      (ToString [this] f))] 
    (defmethod clojure.core/print-method (type r) [this writer] 
     (print-simple f writer)) 
    r)) 

(. 난 단지 바닐라 Clojure에서이 테스트를했지만, 나는 그것이 ClojureCLR에서 같은 생각)이 시점에서

하지만, 당신이 '당신은 이런 식으로 뭔가를해야 할 것이다 매번 메소드를 다시 정의하기 때문에 구체화하는 대신 실제 유형을 만드는 것이 더 나을 것입니다. (필자는 필요성을 피하기 위해 일종의 글로벌 상태를 수행 할 수 있다고 생각하지만 형식을 정의하는 것이 바람직한 이유를 알 수 있습니다.)

+0

작동하지만 그냥 테스트했습니다. 덧붙여 말하자면, 위에 붙여 넣은 스 니펫도 * st * (str ...) 호출로 감싸는 경우 (println이 print-method를 호출하는 반면 ToString 메서드를 호출하는 것 같습니다). –