Clojure中的解构论证

时间:2018-03-20 01:56:27

标签: clojure destructuring

新手在这里享受Clojure 很多。所以,我有一条HTTP路由:

 (POST   "/login"    request   (post-login request))

这里,“request”是一张里面有很多http内容的地图。和“登录后”功能:

(defn post-login
  ;; Login into the app
  [{{email "email" password "password"} :form-params session :session :as req}]
    (let [user (modusers/get-user-by-email-and-password email password)]
     ;; If authenticated
     (if-not (nil? (:user user))
      (do
       (assoc (response/found "/")
         :session (assoc session :identity (:user user)) :flash "Bitte schön!"))
       (assoc (response/found "/login") :flash "Etwas stimmt nicht mit deinem Zugriffsprozess"))))

但我不明白“请求”是如何解构的。 “电子邮件”和“密码”现在如何在函数内部提供?以及“:as req”是什么意思?这个“技术”有名字吗?

1 个答案:

答案 0 :(得分:2)

如果评论中仍然不清楚,可以快速回答:

您的post-login函数接收一个参数,该参数是表示HTTP请求的映射。借助特殊req关键字,此参数存储在:as中。 因此(defn post-login [req] ...)(defn post-login [{:as req}] ...)完全相同。

地图解构的一种(一种)方式是你在右侧提供一个地图键,在左侧提供它应该被绑定的东西,例如: [{form-params :form-params :as req}]。现在:form-params地图中的req键将绑定到函数体内可用的form-params符号。

当你做"嵌套"时,事情变得更有趣解构。在您的情况下,[{{email "email" password "password"} :form-params :as req}只意味着请求中的:form-params键将绑定到{email "email" password "password"},这又是一个解构本身。最终,"email"中的:form-params键将绑定到email符号,而password则相同。:as 和以前一样,如果您需要访问整个请求(不仅仅是其中的一些参数),您可以通过 [{{:strs [email password]} :form-params session :session :as req}] 获得。

注意:您可以使用另一种语法(一种快捷方式): 879235328905006/video_insights/total_video_views/lifetime