2017-11-28 21 views
1

있는 목록의 첫 번째 위치에있는 문자열을 검색 :어떻게 평가하면 해시 맵 값

(:content {:foo "bar" :biz "baf" :content ("Happy Happy Joy Joy")}) 

를 내가 얻을 :

java.lang.String cannot be cast to clojure.lang.IFn 

나는 "Happy Happy Joy Joy"을 원한다면 문자열, 어떻게해야합니까?

필자의 경우, 해시 맵은 내가해야 할 일입니다 ...리스트 내에서 문자열 값을 생성하지 않았습니다. 나는 clojure가 그것이 호출 위치에있는 것처럼 함수라고 생각한다.

+0

이 목록을 라이브러리의 반환 값으로 사용한다고 언급 했으므로이 목록을지도에 넣으려는 코드는 어디에 있습니까? – Gary

답변

1

코드에서 문자 그대로 그 목록을 정의하는 경우 "인용"이 때문에이 함수로 평가되지 않습니다해야합니다 :

user=> (:content {:foo "bar" :biz "baf" :content '("Happy Happy Joy Joy")}) 
("Happy Happy Joy Joy") 

여기에 유일한 차이점은 ' character입니다 여는 목록 괄호 앞에. list 기능을 사용할 수도 있습니다. 당신이 :content 목록에서 바로 첫 번째 항목을 원하는 경우

, 당신은 다음 first 사용할 수 있습니다 견적을 포함하는 것을 입력 무엇

user=> (first (:content {:foo "bar" :biz "baf" :content '("Happy Happy Joy Joy")})) 
"Happy Happy Joy Joy" 
+0

불행히도 목록은 내가 사용하고있는 라이브러리의 반환 값입니다. – THX1137

+0

REPL에서 인쇄 된 목록 값과 REPL에서 평가할 수있는 목록 값의 차이에 대해 생각한 것 같습니다. 리스트는 괄호'(...) '로 간단하게 _printed_하지만, REPL에서 그대로 평가하려고하면 괄호로 묶은 형태를 함수 호출로 해석합니다. –

+0

음 ... 나는 그것을 깊이 생각할 것입니다. 내 코드에서 다른 문자열을 문자열로 사용하려면 괄호 안에있는 문자열을 가져 오려고합니다. – THX1137

1

이 (') 리터럴 당신이 의지를 받고있는 오류 메시지에 방지하기 위해 따옴표를 사용할 필요가없는 함수에서 반환되는 것과는 다릅니다. REPL이 아닌 실제 REPL에 대해서는 조금만 놀아주세요. 실제 사례 (-> x second :content first)를 들어

(def x '(:content {:foo "bar" :biz "baf" :content '("Happy Happy Joy Joy")})) 

(-> x second :content second first) 
;;=> "Happy Happy Joy Joy" 

은 물론 x 함수 호출입니다 당신이 원하는 것을 할 수 있습니다.

해시지도 (m)와 관련이 있다면 다음 (-> m :content first) 트릭을 수행해야합니다.

다음
(def x [:content {:foo "bar" :biz "baf" :content ["Happy Happy Joy Joy"]}]) 

(-> x second :content first)이 실제로 작동합니다 다음 REPL과 현실 사이의 불일치에

하나 개의 솔루션은 대신리스트의 벡터를 사용하는 것입니다.

+0

목록 대신 벡터를 사용하는 것이 좋습니다 때문에 Upvoted – Gary

0

다른 답변은 quote의 효과를 완전히 명확히하지 못했습니다.

(ns tst.demo.core 
    (:use tupelo.test) 
    (:require 
    [tupelo.core :as t])) 

; Note: 
; (def data {:foo "bar" :biz "baf" :content ("Happy Happy Joy Joy")}) 
; => exception 

(def data-1  '{:foo "bar" :biz "baf" :content ("Happy Happy Joy Joy")}) 
(def data-2  {:foo "bar" :biz "baf" :content '("Happy Happy Joy Joy")}) 
(def data-3 (quote {:foo "bar" :biz "baf" :content ("Happy Happy Joy Joy")})) 
(dotest 
    (is= data-1 data-2 data-3) 
    (is= "Happy Happy Joy Joy" (first (:content data-1))) 
    (is= "Happy Happy Joy Joy" (first (:content data-2))) 
    (is= "Happy Happy Joy Joy" (first (:content data-3)))) 

그래서, data-1 우리가 외부 수준에서 전체 표현식을 인용 수 있습니다 보여주고, data-2 우리는 또한 "함수 호출을"억제하기 위해 각 목록 발현 (괄호에 물건을) 인용 수있는 해석을 보여줍니다이 코드를 참조하십시오 Clojure에서 "목록"유형의.

data-3은 Clojure의 특수 양식 (quote ...)에 대해 작은 따옴표 '이 짧음을 보여줍니다.

데이터 리터럴 양식을 올바르게 가져 오면 data-1data-2data-3은 실제로 독자가 처리 한 후에 동일한 데이터 구조를 생성합니다.

마지막 3 개의 테스트는 3 개의 데이터 구조 중 하나에서 관심있는 문자열을 추출하기위한 적절한 구문을 보여줍니다.


P. 테스트 물건 dotestis=from the Tupelo library입니다.