7

我已经在几种情况下运行过,我想对具有可选功能的对象执行一系列操作。"->" 适用于同一对象上的命令序列(例如 (c (b (ax))) 变为 (-> xabc) ),除非某些操作是可选的。例如,假设我想做:

(c
  (if (> (a x) 2)
     (b (a x))
     (a x)
     )
  )

有没有办法使用像“->”这样的操作以更清晰的方式做到这一点?

4

1 回答 1

12

您可以使用cond->Clojure 1.5 中新引入的 来做到这一点:

(cond-> x
  true        a
  (> (a x) 2) b
  true        c)

或更好,

(-> x
  a
  (cond-> (> (a x) 2) b)
  c)

意思是,“获取x,穿过它a,取结果并穿过bif(> (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
于 2013-07-06T23:36:35.960 回答