当一个地图(用作函数)给出两个参数时

时间:2017-05-13 16:51:57

标签: clojure

我正在浏览Ring的来源:

(def redirect-status-codes
  {:moved-permanently 301
   :found 302
   :see-other 303
   :temporary-redirect 307
   :permanent-redirect 308})

(defn redirect
  ([url] (redirect url :found))
  ([url status]
   {:status  (redirect-status-codes status status)
    :headers {"Location" url}
    :body    ""}))

为什么(redirect-status-codes status status)代替(redirect-status-codes status)?为什么(如何)有效?

2 个答案:

答案 0 :(得分:4)

redirect会以此方式进行编码,因此它可以接受关键字或数字status

关于(redirect-status-codes status status)如何运作,请查看the Clojure reference on maps

  

Maps实现IFn,用于一个参数(一个键)的invoke(),带有可选的第二个参数(默认值)

因此,对于(redirect "https://www.google.com"),地图调用变为(redirect-status-codes :found :found)。由于:foundredirect-status-codes的关键字,因此会返回相应的值302;第二个:found对回报没有影响。

对于(redirect "https://www.google.com" 302),地图调用变为(redirect-status-codes 302 302)。此时302不是redirect-status-codes的键,因此第二个参数302将作为默认值返回。

答案 1 :(得分:2)

最后一个参数是默认值 - 如果没有找到匹配则返回的值。

因此,我们在status中查找redirect-status-codes,但是如果它不存在于该地图中,则使用其现有值(例如,如果值为,就会发生这种情况已经数字)。