2016-06-30 2 views
8

나는 clojure.spec guide을 따르고 있습니다. clojure.spec/keys를 사용할 때 필수 및 선택 속성을 선언하는 것이 가능하다는 것을 알고 있습니다.clojure.spec의 금지 된 키

옵션으로 무엇을 의미하는지 이해할 수 없습니다. 나에게 : opt는 아무 것도하지 않는다.

(s/valid? (s/keys :req [:my/a]) {:my/a 1 :my/b 2}) ;=> true 

(s/valid? (s/keys :req [:my/a] :opt []) {:my/a 1 :my/b 2}) ;=> true 

가이드는 나에게 이것을 설명하기 위해 약속, "우리는 선택 속성이 유용 할 수있는 나중에 보자"하지만 설명을 찾지 못합니다. 금지 된 키를 선언 할 수 있습니까? 또는 어떻게 든 유효한 키 세트를 req와 : opt에있는 키와 동일하게 선언하십시오.

답변

8

이 아주 좋은 질문이고, clojure.spec API은 (부여, 짧고 만족스럽지) 답변을 제공합니다

을 : 선택 하 키 문서의 역할을하고 발전기에 의해 사용될 수있다.

맵에 무언가가 포함되어있는 경우 맵을 무효화 할 수 없다고 생각합니다.이 방법을 사용하여 "금지 된"키라고 생각합니다. 그러나, 확실 :: 잘못된 키를 만들기 위해이 사양을 사용할 수있는 것은 존재하지 :

(s/def ::m (s/and (s/keys :req [::a]) #(not (contains? % ::bad-key)))) 
(s/valid? ::m {::a "required!"})      ; => true 
(s/valid? ::m {::a "required!" ::b "optional!"})  ; => true 
(s/valid? ::m {::a "required!" ::bad-key "no good!"}) ; => false 

당신은 키의 수를 제한 할 수 정확히이 스펙을 사용하여 원하는 설정 :

(s/def ::r (s/and (s/keys :req [::reqd1 ::reqd2]) #(= (count %) 2))) 
(s/valid? ::r {::reqd1 "abc" ::reqd2 "xyz"})    ; => true 
(s/valid? ::r {::reqd1 "abc" ::reqd2 "xyz" ::extra 123}) ; => false 

여전히,이 IMO를 다루는 가장 좋은 방법은 당신이 신경 쓰지 않는 열쇠가 있다는 것을 단순히 무시하는 것입니다.

스펙이 성숙해지기를 바랍니다. 이러한 멋진 것들이 추가 될 것입니다. 또는 어쩌면 그들은 이미 거기에있다 (그것은 빠르게 변화하고있다). 그리고 나는 그것에 대해 간단히 알지 못한다. 이것은 clojure에서 매우 새로운 개념이므로 우리 대부분은 그것에 대해 배울 점이 많습니다.

업데이트 - 2016 년 12 월 작성한 지 6 개월 만이었습니다. 내가 선호하지 않는 키를 무시하는 것에 대한 저의 처음 의견이 선호되는 방법입니다. 실제로 2 주 전에 열린 clojure/conj 컨퍼런스에서 Rich의 기조 연설은 함수 레벨에서 애플리케이션 레벨까지 모든 레벨의 소프트웨어에서 버전 관리 개념을 구체적으로 다루었습니다. 그는 구체적으로 말하자면, on youtube이라는 토크에서 키를 허용하지 않는 개념을 언급합니다. 그는 필수 키만 스펙을 지정할 수 있도록 고의적으로 설계되었다고 말합니다. 키를 금지하는 것은 좋은 목적이 아니므로주의해서 수행해야합니다. 옵션 키에 대한

(s/def ::name #{"Bob" "Josh" "Mary" "Susan"}) 
(s/def ::height-inches (s/int-in 48 90)) 
(s/def ::person (s/keys :req-un [::name] :opt-un [::height-inches])) 

(map first (s/exercise ::person)) 

; some generated data have :height-inches, some do not 
({:name "Susan"} 
{:name "Mary", :height-inches 48} 
{:name "Bob", :height-inches 49} 
{:name "Josh"} 
+0

"키를 허용하지 않으면 실제로 아무런 도움이되지 않으므로주의해야합니다." 흠. 그 맥락에서 듣기 위해 이야기를보아야 할 것입니다. 그러나 암호 필드가 기능에서 누출되지 않는지 확인하는 것은 어떻습니까? 나는 요점은 당신이 정말로 명시 적 키 외에 어떤 다른 방법으로 그것을 유출하지 않는다는 것을 확신 할 수 없다는 것이지만, 명백한 것을 검사하는 것이 좋은 목적이 없다고 말하는 것은 과장된 것처럼 보입니다. 그렇지 않습니까? – neverfox

+0

그래서 나는 그 말을 들었다. 그 스펙은 당신이 할 수있는 것에 관한 것이지 당신이 할 수없는 것에 관한 것이 아닙니다.그러나 그는 그것을 무시하는 것이 바람직한 방법이라고 정확하게 말하지 않았습니다. 그는 그것이 두 가지 선호되는 방법 중 하나라고 말했고, 다른 하나는 "정책을 가지고있다"고 말했다. 올바르게 이해한다면 성장을 막지 않기 위해 다음과 같은 두 가지 일을 할 수 있습니다. 1) 표시 방법을 사용하여 키를 허용하지 않은 "무시 무시한"사양에서 별도로 명명 된 사양을 정의합니다. 지금 사용할 수 있습니다. 영원히 사용, 또는 나중에 드롭, 2) 독립적 인 체커를 작성하십시오. 그는 실제로 나의 경우도 다루었습니다. 아마도 선택 키를 사용해야 할 것입니다. – neverfox

-3

요점은 : 그것은 문서, 그리고 실제적으로, 이러한 선택적으로 지정된 키를 생성 할 수 있습니다 - :opt 키에 관한

, 나는 원래 대답은 여전히 ​​꽤 잘 버틴다 생각 값이이면지도에 표시되는 경우 유효성이 확인됩니다.

+1

그건 사실이 아닙니다. 값은 상관없이 유효성이 검사됩니다. –

+0

키가 필수 또는 선택 사항이 아닌 경우이 값은 전혀 유효성이 검사되지 않습니다. 나는 필수 키에 대해 값이 유효하지 않음을 의미하지 않았다. – DanLebrero

+1

"또한 * 모든 * 네임 스페이스 한정 키의 값은 등록 된 사양에 따라 (유효하지 않은) 유효성이 검사됩니다." (Docstr of's/keys') –