- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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/
defn = 公共(public) defn- = 私有(private) 也许我的 Clojure 编码风格不好——但我发现我在 Clojure 中编写的大多数函数都是我不想公开的小辅助函数。 是否
谁能给我解释一下?我想我理解 (defn -main) 声明了一个 Java 可以识别的 main 方法,如果你将它与带有 (:gen-class) 的命名空间一起使用,你可以欺骗 Java 认为 c
我看到 Clojure 函数定义为 (defn toInt([i] (Integer. i))) 为什么参数[i]包含在括号中?这和下面的一样吗?有什么区别吗? (defn toInt [i] (I
我可以在没有副作用的情况下实时重新定义功能吗? defn 线程安全吗? 最佳答案 “线程对开发来说足够安全,而不是在生产中使用。” 使用 defn 重新定义函数可能会破坏调用它的函数,如果它们在调用更
我试图只获取一个生肖名称以将其传递给不同的函数,但我不知道为什么在显示生肖后我会得到空括号。我是 Clojure 的新手。 (defn miko []
如果我明确定义这样的函数 (defn f [x] (get x "a")) , 然后两者 (-> {"a" 1} f)和 (f {"a" 1})按预期工作。 但是,如果我使用匿名函数,则只有 (#(g
Clojure 风格(以及一般良好的软件工程)强调许多小函数,其中的一个子集是公开可见的,以提供外部接口(interface)。 在 Clojure 中似乎有几种方法可以做到这一点: (letfn [
我是 clojure 的 super 新手,我正在尝试为 clojure 函数中的 args 设置故障值。这是我目前所拥有的: (defn get-user-projects-by-user-id (
我定义了一个函数,它接受两个参数 - 映射和一个键。 key引用自map参数分解 (defn myfunc [{v k} k] v) 当我打电话时: (myfunc {:a 10} :a)
我对defn的作用有点困惑。如果 fn 只生成匿名函数,我可以理解需要一个结合 def 和 fn 功能的构造,但 fn 也可以创建命名函数。至少在 repl 中,我看不出这种用法与 defn 有什么不
我用 clojure 编写了一个程序,但有些函数没有参数。将此类函数编码为“def”而不是不带参数的“defn”有什么优点? 最佳答案 (def t0 (System/currentTimeMilli
我是 clojure 的 super 新手,我正在尝试为 clojure 函数中的 args 设置故障值。这是我目前所拥有的: (defn get-user-projects-by-user-id (
我有一个用 Clojure 编写的小游戏。我对这门语言很陌生,我偶然发现的第一个错误是 对 clojure.core/defn 的调用不符合规范。 我不知道是什么导致了这个错误,但是抛出了一个异常:
我熟悉来自例如的包Java 和 Lisp,但我在其他人的代码中看到的是一些明显的习语,例如调用入口点 '-main' 并在 (in-ns `foo) 中对命名空间名称使用反引号,诸如此类。我在文档或教
观察以下 repl session : user=> (set! *warn-on-reflection* true) true user=> (defn blah [s] (for [c s] (i
一些 core.logic 构造( matcha 、 matche 、 matchu 、 defne 、 fne )使用模式匹配表达式作为主体,可以使用,例如: (run* [q] (fresh
我编写了一个宏来将函数定义包装在一些有用的日志记录中: (defmacro defn-logged "Wraps functions in logging of input and output"
我正在练习编写宏,但我似乎无法让 defn 工作。 我的语法是:(my-define nameparameter body) 忽略 & 参数和递归例程,如何将名称绑定(bind)到 (fn[param
在Scheme中,我们只是对所有的定义进行了define,为什么Clojure和Lisp对不同的声明使用不同的关键字? 最佳答案 defn、defmacro、defstruct等只是定义其对应结构的宏
以下是在 Clojure 中编写函数的两种方法: (defn foo [a b] (+ a b)) (fn foo [a b] (+ a b)) 我可以这样调用它们: 在“defn”的情况下 (foo
我是一名优秀的程序员,十分优秀!