Clojure:map作为函数参数

Pau*_*uli 1 clojure

我正在尝试运行"使用Clojure进行Web开发"一书中的一些代码.有一个我无法理解的功能:

(defn handle-upload [{:keys [filename] :as file}]
  (upload-page 
    (if (empty? filename)
      "please select a file to upload"
      (try 
        (upload-file (gallery-path) file)
        (save-thumbnail file)
        (db/add-image (session/get :user) filename)
        (image {:height "150px"}
          (str "/img/"
               (session/get :user)
               "/"
               thumb-prefix
               (url-encode filename)))
        (catch Exception ex 
          (str "error uploading file " (.getMessage ex)))))))
Run Code Online (Sandbox Code Playgroud)

哪里

(defn upload-page [info]
    (layout/common
      [:h2 "Upload an image"]
      [:p info]
      (form-to {:enctype "multipart/form-data"}
               [:post "/upload"]
               (file-upload :file)
               (submit-button "upload"))))
Run Code Online (Sandbox Code Playgroud)

函数参数的含义是什么handle-upload

并且从改变之后

(defn handle-upload [{:keys [filename] :as file}] ...

(defn handle-upload [{:keys filename :as file}] ...

我收到一条错误消息:

java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol, compiling:(picture_gallery/routes/upload.clj:32:1)

为什么?

zer*_*kms 5

{:keys [filename] :as file} 手段:

  1. :filename从传递的参数中获取键并将其值绑定到filename
  2. 将整个论点保留为 file

所以,如果你通过:

{:filename "foo"
 :somethingelse "bar"}
Run Code Online (Sandbox Code Playgroud)

作为参数,那么filename在函数范围中将等于foo并且file将等于整个哈希映射.

参考文献: