[由于缺少#,编辑答案]
走这条路有点蹩脚,因为constantly
的意图是允许任意参数的函数,它们总是返回一个常量。#(...)匿名函数简写提供了快速定义匿名函数的便捷方式,这些函数以不同的arity(参数数量)工作。
0 - #(vector)
1- #(vector %1)
2 - #(vector %1 %2)
...
n - #(vector %1 %2 ... %n)
& args - #(apply vector %&)
但是有一些限制,因为你在定义函数体...如果你尝试定义一个像identity这样的东西,它最终会看起来像是一个调用。
#(%)
;; 这将尝试将单个参数作为一元函数调用。
可以通过在let或其他形式中绑定输入来工作,从而表示arity(参数数量)...
#(let [v %] v)
或者
#(do %)
将像identity一样工作,我们只是在函数体中返回它。
我们想定义一个变长参数的函数,因此想用%&来表示参数。但是,这些参数对结果来说是没有意义的……它们唯一的作用是向匿名的函数糖传递参数的数量或参数的个数。
虽然略显笨拙,但这是实现它的方法之一
(defn constantly2 [v]
;;ignore the arguments, but communicate a varargs function
#(let [_ %&]
v))
user=> (def f (constantly2 10))
#'user/f
user=> (f 1 2 3 4)
10
user=> (f 1)
10
user=> (f 5)
10
user=> (f :a)
10
我可能会避免使用#(..)语法糖进行这类操作。这种简写对于非常简单的内联匿名函数来说最有用,即使在那时,我也通常更喜欢显式地写出一个fn
。