[由于回答缺少 # 而已编辑]
这样做有点拙劣,因为 constantly
的目的是允许任意参数的函数始终返回一个常量。#(...) 匿名函数简写提供了快速定义匿名函数的快捷方法,这些函数可以处理各种参数数量。
0 - #(vector)
1- #(vector %1)
2 - #(vector %1 %2)
...
n - #(vector %1 %2 ... %n)
& args - #(apply vector %&)
但是有一些限制,因为您正在定义函数体……如果您尝试定义像 identity 这样的东西,最终结果将类似于调用。
#(%)
;; 这将尝试像一元函数一样调用单个参数。
一种解决方法是使用 let 或其他形式绑定输入来传达参数数量……
#(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。