有没有办法在clojure中避免这种重复的代码?

use*_*372 3 clojure

我得到了一些参数,然后调用一个接受参数映射的函数.地图的关键名称是params的名称,如下所示:

   (GET "/api/search" [nick_name gender phone max_age min_age page lmt ]
        (db-search-users :nick_name nick_name :gender gender :phone phone
:max_age max_age :min_age min_age :page page :lmt lmt))
Run Code Online (Sandbox Code Playgroud)

有没有办法避免复制和粘贴?

Mic*_*zyk 7

我认为你使用的是Compojure?你不需要对参数图进行解构(Compojure中的向量是参数图上的类似{:keys [...]}解构的简写),你可以简单地将它传递给你的函数:

;; you can use a map to destructure the entire request map
(GET "/api/search" {:keys [params]}
  (db-search-users (select-keys params [:nick_name ...])))
Run Code Online (Sandbox Code Playgroud)

select-keys 是可选的,虽然没有它你的功能可能最终在地图中接收意外的键.

params在传递它们之前,您可能需要考虑验证- 可能将某些值强制转换为更有用的类型db-search-users.请参阅Prismatic的架构以获得执行此操作的好方法.