3

私はこのような機能を持っています:

(defn foo [{a :keya b :keyb}]
  (list a b))

そして、私はそれを次のように呼んでいます:

(foo {:keya "hi"}) ; Returns ("hi" nil)

keybキーワード引数を指定しない場合、それには nil が必要です。nil として受け取るのではなく、確実に例外をスローする方法はありますか。

(手動でチェックして例外をスローできることは知っていますが、制約を強制する特別なオプションはありますか。)

4

4 に答える 4

2

aldazosaは正しい解決策を提供してくれました{:keya nil :keyb nil}が、有効なマップでもあります。チェックの代わりにnil使用できる値を許可するには:contains?nil?

(defn foo [{a :keya b :keyb :as m}]
  {:pre [(every? (partial contains? m)
                 [:keya :keyb])]}
  (list a b))
于 2013-06-30T11:55:18.710 に答える
2

いいえ、もちろん、Clojure は Lisp であるため、退屈な「手動チェック」を自動的に処理する独自のマクロを定義できます。

于 2013-06-29T20:10:35.367 に答える