2017-05-13 22 views
2

我在瀏覽戒指的來源:當一個地圖(用作函數)給出兩個參數

(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)?爲什麼(如何)起作用?

回答

4

redirect這種方式有意編碼,因此它可以接受關鍵字或數字作爲status

至於(redirect-status-codes status status)是如何工作的,請查看the Clojure reference on maps

地圖實現IFN,用於調用(一個參數(關鍵)的)與可選第二個參數(默認值)

所以對於(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作爲默認值返回。

2

最後一個參數是默認值 - 如果找不到匹配項,則返回的值。

因此,我們期待在redirect-status-codesstatus,但使用其現有的價值應該是不會出現在地圖上(這會發生,如果,例如,該值分別爲已經數字)。

相關問題