不能将第一个参数作为可选参数
Cannot have first parameter as optional
你能有一个带有可选参数作为第一个也是唯一参数的函数吗?
因此
(defn foo [& bar] (if (= bar) 1 2))
& bar
在函数定义中的意思是所有其余的参数将被放入一个列表中。它不对列表的大小提供任何保证,因此它可能是空的,包含一个或多个项目。
一种只有一个可选参数的更好方法是让它接受零个或一个参数:
(defn foo
([] (foo 12))
([bar] (if (= bar 12) 1 2)))
在此示例中,如果您调用第一个参数为零的函数定义,它将简单地调用默认值为 12 的第二个参数为 1 的函数定义。
这会起作用:
(defn foo [& bar]
(if (seq bar) 1 2))
使用 seq
是您应该使用的编码方式 'not empty'。不要与 seq?
混淆,后者的意思完全不同,实际上这里是 return true
。
重要的一点是bar
在函数体内变成了一个列表。如果你想让这个列表恢复到你调用函数时的状态,那么使用 apply
,或者在函数本身中解构列表,如下面的评论中所解释的......
你能有一个带有可选参数作为第一个也是唯一参数的函数吗?
因此
(defn foo [& bar] (if (= bar) 1 2))
& bar
在函数定义中的意思是所有其余的参数将被放入一个列表中。它不对列表的大小提供任何保证,因此它可能是空的,包含一个或多个项目。
一种只有一个可选参数的更好方法是让它接受零个或一个参数:
(defn foo
([] (foo 12))
([bar] (if (= bar 12) 1 2)))
在此示例中,如果您调用第一个参数为零的函数定义,它将简单地调用默认值为 12 的第二个参数为 1 的函数定义。
这会起作用:
(defn foo [& bar]
(if (seq bar) 1 2))
使用 seq
是您应该使用的编码方式 'not empty'。不要与 seq?
混淆,后者的意思完全不同,实际上这里是 return true
。
重要的一点是bar
在函数体内变成了一个列表。如果你想让这个列表恢复到你调用函数时的状态,那么使用 apply
,或者在函数本身中解构列表,如下面的评论中所解释的......