2012-11-15 2 views
8

나는 기본적으로 일부 자습서를 따르고 자 노력하는 완전 초보자입니다. defrecord에 대한 질문이 있습니다. 난 늘 그들에게 값을 각 시간을 줄 필요가 그래서 내가, 옵션 등 key3key4을하고 싶은, 위의 코드에선택 키를 사용하는 defrecord

(defrecord somemap [key1 key2 key3 key4]) 

(defn give-me-map [m1 m2] 
    (somemap. m1 m2)) 

: 여기

내가 할 노력하고있는 것입니다 somemap 개체를 만듭니다.

비슷한 질문이 있습니다. here,하지만 여기에 나와있는 것과는 반대입니다.

따라서 선택 필드가있는 defrecord을 정의 할 수 있습니까?

+3

당신이 clojure의 초보자 인 경우 defrecord를 건너 뛰고 싶습니다. 지금은 사촌입니다. 그것들 없이는 꽤 유용한 코드를 작성할 수 있습니다. – Cubic

답변

8

(defrecord T [...])을 사용하면 ->Tmap->T의 두 팩토리 함수가 만들어집니다.

첫 번째 매개 변수는 위치 매개 변수를 키로 사용합니다. 두 번째는 임의의 맵을 레코드에 적용합니다.

key3key4을 생성자에 유지하고 map->somemap을 사용할 수 있습니다.

(defrecord somemap [key1 key2 key3 key4]) 

(defn give-me-map 
    [key1 key2] 
    (map->somemap {:key1 key1 :key2 key2})) 
6

Clojure의 레코드는 맵 인터페이스를 구현하므로 생성자에 지정된 필드를 제외한 모든 필드는 선택 사항입니다. 단지 key1key2 생성자에 필요합니다,하지만 당신은 쉽게 값을 associng에 의해 key3 또는 key4 (또는 그 문제에 대해 다른 키를) 설정할 수 있습니다

따라서 만 key1key2으로 기록을 선언하는 것은 정확 그 (것)들에게 다른 어떤지도 같이 기록에.

+0

map-> constructor을 사용할 때 모든 키가 선택적이라는 것이 레코드를 이해하고 있습니다. 다음을 참조하십시오. ''' (defrecord Bar [a b c]) (def r (map-> Bar {: c 30})) ;; # my-ns.Bar {: a nil, : b nil, : c 30}''' – nha

관련 문제