gpt4 book ai didi

clojure - 在 clojure defn 中设置默认值

转载 作者:行者123 更新时间:2023-12-01 22:01:05 24 4
gpt4 key购买 nike

我是 clojure 的 super 新手,我正在尝试为 clojure 函数中的 args 设置故障值。这是我目前所拥有的:

(defn get-user-projects-by-user-id
([db-conn userid] (get-user-projects-by-user-id db-conn userid (str "asc") nil 10 10))
([db-conn userid sort filters offset size]
;;rest of the function

我想要完成的是,每当函数不接收排序、过滤器、偏移量或大小,或者作为 nil/false,它们分别获得默认值“asc”、nil、10 和 10 .

但是,每当我不将这些参数中的任何一个发送到 get-user-projects-by-user-id 时,(println sort filters offset size) 为 nil nil nil nil。

如何将它们设置为我想要的默认值?

最佳答案

这里有3种我能想到的方法:

您的版本:

(defn get-user-projects-by-user-id
([db-conn userid] (get-user-projects-by-user-id db-conn userid "asc" nil 10 10))
([db-conn userid sort filters offset size]
(println "arguments: sort:" sort "filters:" filters "offset:" offset "size:" size)))

;; (get-user-projects-by-user-id 'db 'userid)
;; => arguments: sort asc , filters nil , offset 10 , size 10

另一种风格是传递一个 opts 参数,它是一个带有您想要的选项的映射,您可以使用 destructuring 以方便的方式提供默认值。 :

(defn get-user-projects-by-user-id-with-opts
([db-conn userid]
(get-user-projects-by-user-id-with-opts db-conn userid nil))
([db-conn userid {:keys [sort filters offset size]
:or {sort "asc" offset 10 size 10}}]
(println "arguments: sort:" sort "filters:" filters "offset:" offset "size:" size)))

;; (get-user-projects-by-user-id-with-opts 'db 'userid)
;; => arguments: sort: asc filters: nil offset: 10 size: 10

;; (get-user-projects-by-user-id-with-opts 'db 'userid {:sort "desc" :offset 20})
;; => arguments: sort: desc filters: nil offset: 20 size: 10

最后,还有第三种方法有时在旧库中使用,它是将任意数量的参数传递给你的函数,并在其他参数之后采用可选参数(我猜这有点像 Python):

(defn get-user-projects-by-user-id-with-varargs
[db-conn userid & args]
(let [arg-map (apply hash-map args)
{:keys [sort filters offset size]
:or {sort "asc" offset 10 size 10}} arg-map]
(println "arguments: sort:" sort "filters:" filters "offset:" offset "size:" size)))

;; (get-user-projects-by-user-id-with-varargs 'db 'userid)
;; => arguments: sort: asc filters: nil offset: 10 size: 10

;; (get-user-projects-by-user-id-with-varargs 'db 'userid :sort "desc" :offset 20)
;; => arguments: sort: desc filters: nil offset: 20 size: 10

关于clojure - 在 clojure defn 中设置默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53455826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com