在“->”语句中翻转参数

flipping arguments in the "->"statement

代码后面的代码不起作用,因为重新查找接受字符串作为第一个参数,正则表达式作为第二个参数。

(-> "hello"
    .toUpperCase
    (re-find #".$"))

如果我像这样包装重新查找,代码将起作用:

(defn re-find2 [s r]
   (re-find r s))

如果我现在用 re-find2 替换 re-find,我会得到我期望的结果:大写的 "O"。

如何在不包装重新查找的情况下解决这个问题?

对于这种特定情况,您可以改用 thread-last 宏。

(->> "hello" .toUpperCase (re-find #".$"))

如果您确实需要在作为第一个参数和最后一个参数传递之间切换,您可以链接线程宏:

(-> "hello" .toUpperCase (->> (re-find #".$")))

如前所述,如果您的所有函数只有一个参数或将结果作为最后一个参数,则可以使用 thread-last。但是,如果您还有具有多个参数的函数,并且您必须将结果传递到 -> 或 ->> 无法处理的特定位置,那么 as-> 宏可能是您最好的选择。

此宏允许您为每个函数调用的结果指定一个绑定。由于结果现在有了名称,您可以控制该参数的位置。看看this blog post on threading macros