有人知道在Clojure中提供关键字参数的好方法吗?

5

我希望能够像这样使用关键字参数来调用Clojure函数:

(do-something :arg1 1 :arg2 "Hello")

没有必要执行以下操作,这是否可行:

(do-something {:arg1 1 :arg2 "Hello"})

我可以使用 :pre 预设条件来提供某种验证以确保所有参数都被包括在内吗?


可能是重复问题:Clojure - 命名参数 - Rayne
2个回答

5

关键字参数是通过rest参数的内置解构提供的(虽然在1.2版中这个特殊形式的主要文档未能涵盖这一补充):

(defn foo
  [a b & {:keys [c d]}]
  [a b c d])
#'user/foo
(foo 1 2 :c 12 :d [1])
[1 2 12 [1]]

所有通常的映射解构设施都可用(例如:or:strs:syms等)。


3
如果您想为关键字参数设置默认值,请按照以下步骤操作(Clojure 1.2):
(defn foo
  [req1 req2 & {:keys [opt1 opt2] :or {opt1 :hello opt2 :goodbye}}]
  [req1 req2 opt1 opt2])
#'user/foo
user=> (foo :a :b)
[:a :b :hello :goodbye]
user=> (foo :a :b :opt1 "xyz")
[:a :b "xyz" :goodbye]

“:or” 是语法的一部分还是另一种实现方式? - yazzapps.com
@Zubair::or是可选的。如果没有提供它,那么如果缺少参数,它们将获得null值:(defn foo [req1 req2 & {:keys [opt1 opt2]}] [req1 req2 opt1 opt2]) (foo :a :b) => [:a :b nil nil] - Ralph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接