2016-07-16 34 views
3

第一个参数,您可以有一个功能和可选参数作为第一个和唯一的参数?不能有可选

从而

(defn foo [& bar] (if (= bar) 1 2))

+2

'(= X)在' Clojure是总是TRUE;,无论什么'x'是,只要'x'不通过抛出异常破坏形式的执行 – noisesmith

回答

10

& bar指函数的定义是什么的争论所有其余的将被放入一个列表。它不能保证列表的大小,所以它可以是空的,有一个或多个项目。

一个更好的方法具有一个和唯一的可选参数,是有它接受零个或一个参数:

(defn foo 
    ([] (foo 12)) 
    ([bar] (if (= bar 12) 1 2))) 

在这个例子中,如果你调用第一个函数的定义,以零元数,它会只需拨打与12

0

默认值第二个1元数的函数定义这将工作:

(defn foo [& bar] 
    (if (seq bar) 1 2)) 

使用seq就是这样,你重新编码“不空”。不要与seq?混淆,这意味着完全不同的东西,这将在事实上回到这里true

重要的一点是,bar在函数体内的列表。如果你想获得这个名单回到了它是当你调用的函数,然后使用apply,或解构的功能本身的列表,如下面的评论被解释......

+5

的常见模式是'[&[巴]]'其中自毁第一参数并使其成为可选项。 – ClojureMostly

+0

@ClojureMostly但是导致任何额外的参数被忽略,这可能会导致微妙的错误等[本](https://github.com/magomimmo/modern-cljs/issues/373)。 –

相关问题