[由于答案中缺少 # 被编辑]
这种方式相对不规范,因为 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
。