이 아주 좋은 질문이고, 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"}
"키를 허용하지 않으면 실제로 아무런 도움이되지 않으므로주의해야합니다." 흠. 그 맥락에서 듣기 위해 이야기를보아야 할 것입니다. 그러나 암호 필드가 기능에서 누출되지 않는지 확인하는 것은 어떻습니까? 나는 요점은 당신이 정말로 명시 적 키 외에 어떤 다른 방법으로 그것을 유출하지 않는다는 것을 확신 할 수 없다는 것이지만, 명백한 것을 검사하는 것이 좋은 목적이 없다고 말하는 것은 과장된 것처럼 보입니다. 그렇지 않습니까? – neverfox
그래서 나는 그 말을 들었다. 그 스펙은 당신이 할 수있는 것에 관한 것이지 당신이 할 수없는 것에 관한 것이 아닙니다.그러나 그는 그것을 무시하는 것이 바람직한 방법이라고 정확하게 말하지 않았습니다. 그는 그것이 두 가지 선호되는 방법 중 하나라고 말했고, 다른 하나는 "정책을 가지고있다"고 말했다. 올바르게 이해한다면 성장을 막지 않기 위해 다음과 같은 두 가지 일을 할 수 있습니다. 1) 표시 방법을 사용하여 키를 허용하지 않은 "무시 무시한"사양에서 별도로 명명 된 사양을 정의합니다. 지금 사용할 수 있습니다. 영원히 사용, 또는 나중에 드롭, 2) 독립적 인 체커를 작성하십시오. 그는 실제로 나의 경우도 다루었습니다. 아마도 선택 키를 사용해야 할 것입니다. – neverfox