我正在浏览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)
?为什么(如何)有效?
答案 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)
。由于:found
是redirect-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
,但是如果它不存在于该地图中,则使用其现有值(例如,如果值为,就会发生这种情况已经数字)。