【问题标题】:Destructuring argument in ClojureClojure 中的解构参数
【发布时间】:2018-08-28 17:38:38
【问题描述】:

新手在这里非常喜欢使用 Clojure。所以,我有一个 HTTP 路由:

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

这里,“request”是一个map,里面有很多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”是什么意思?这种“技术”有名字吗?

【问题讨论】:

标签: clojure destructuring


【解决方案1】:

如果 cmets 仍然不清楚,这里有一个快速的答案:

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

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

当您进行“嵌套”解构时,事情会变得更有趣。在您的情况下,[{{email "email" password "password"} :form-params :as req} 仅表示请求中的:form-params 键将绑定到{email "email" password "password"},这本身又是一种解构。最终,:form-params 中的 "email" 键将绑定到 email 符号,password 也是如此。 和以前一样,如果您需要访问整个请求(不仅仅是其中的一些参数),您可以通过 :as 获得。

注意:您可以使用另一种语法(一种快捷方式): [{{:strs [email password]} :form-params session :session :as req}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2012-02-15
    相关资源
    最近更新 更多