在另一个问题的接受答案中,Setting Clojure "constants" at runtime使用了clojure函数constantly
。
constantly
的定义如下:
(defn constantly
"Returns a function that takes any number of arguments and returns x."
{:added "1.0"}
[x] (fn [& args] x))
文档字符串说明它的作用,但不是为什么会使用它。
在上一个问题中给出的答案中,常常使用如下:
(declare version)
(defn -main
[& args]
(alter-var-root #'version (constantly (-> ...)))
(do-stuff))
因此,不断返回的函数会直接评估其结果。我很困惑这是如何有用的。我可能不理解如何评估x
是否会被“不断”包裹起来。
我应该何时使用constantly
,为什么有必要?
答案 0 :(得分:12)
当API需要一个函数而你只想要一个常量时,constantly
函数很有用。问题中提供的示例就是这种情况。
大多数alter-*
函数(包括alter-var-root
)都使用一个函数,以允许调用者根据其旧值修改某些内容。即使你只想让新值为7(忽略旧值),你仍然需要提供一个函数(只提供7将导致尝试评估它,这将失败)。所以你必须提供一个只返回7的函数。(constantly 7)
只生成这个函数,省去了定义它所需的工作。
编辑:至于问题的第二部分,constantly
是一个普通函数,因此在构造常量函数之前评估它的参数。因此,(constantly @myref)
始终会在调用myref
时返回constantly
引用的值,即使稍后更改。