【发布时间】:2016-11-19 07:16:52
【问题描述】:
你能有一个函数,它的第一个也是唯一的参数是可选参数吗?
因此
(defn foo [& bar] (if (= bar) 1 2))
【问题讨论】:
-
(= x)在 clojure 中总是true,不管x是什么,只要x不会通过抛出异常来中断表单的执行
标签: clojure clojurescript
你能有一个函数,它的第一个也是唯一的参数是可选参数吗?
因此
(defn foo [& bar] (if (= bar) 1 2))
【问题讨论】:
(= x) 在 clojure 中总是true,不管x 是什么,只要x 不会通过抛出异常来中断表单的执行
标签: clojure clojurescript
& bar 在函数定义中的意思是将所有其余参数放入一个列表中。它不保证列表的大小,因此它可以是空的,包含一个或多个项目。
拥有一个且唯一可选参数的更好方法是让它接受零个或一个参数:
(defn foo
([] (foo 12))
([bar] (if (= bar 12) 1 2)))
在这个例子中,如果你调用第一个函数定义,零元,它只会调用第二个 1 元函数定义,默认值为 12。
【讨论】:
这将起作用:
(defn foo [& bar]
(if (seq bar) 1 2))
使用seq 是您应该编码“非空”的方式。不要与seq? 混淆,这意味着完全不同的东西,实际上会在这里返回true。
重要的一点是bar 变成了函数体内的一个列表。如果您想将此列表恢复为调用函数时的状态,请使用apply,或在函数本身中解构列表,如下面的 cmets 中所述...
【讨论】:
[& [bar]],它会破坏第一个参数并使其成为可选参数。