我已经在几种情况下运行过,我想对具有可选功能的对象执行一系列操作。"->" 适用于同一对象上的命令序列(例如 (c (b (ax))) 变为 (-> xabc) ),除非某些操作是可选的。例如,假设我想做:
(c
(if (> (a x) 2)
(b (a x))
(a x)
)
)
有没有办法使用像“->”这样的操作以更清晰的方式做到这一点?
您可以使用cond->
Clojure 1.5 中新引入的 来做到这一点:
(cond-> x
true a
(> (a x) 2) b
true c)
或更好,
(-> x
a
(cond-> (> (a x) 2) b)
c)
意思是,“获取x
,穿过它a
,取结果并穿过b
if(> (a x) 2)
或保持不变,最后拿走你所拥有的并将它穿过c
”。
换句话说,cond->
is like ->
,除了通过它使用 test+form 对来代替单个表单来贯穿您的表达式,如果 test 为假则跳过该表单,如果 test 为真则用于线程:
(cond-> x
test-1 form-1
test-2 form-2)
;; if test-1 is truthy and test-2 is falsey, output is as if from
(-> x test-1)
;; if it's the other way around, output is as if from
(-> x test-2)
;; if both tests are truthy:
(-> x test-1 test-2)
;; if both tests are falsey:
x