在“->”语句中翻转参数
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
代码后面的代码不起作用,因为重新查找接受字符串作为第一个参数,正则表达式作为第二个参数。
(-> "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