【问题标题】:Idiomatic way to return value if test succeeds or return default in Clojure如果测试成功或在 Clojure 中返回默认值,则返回值的惯用方式
【发布时间】:2015-11-15 13:56:34
【问题描述】:

只有在测试成功时才返回值,否则返回默认值的惯用方式是什么?我想构建一个很简单,但我想知道是否有用于此目的的内置函数。

(def a {:name "foo"})
(if (map? a) a {})
; {:name "foo"}

(def b "bar")
(if (map? b) b {})
; {}

; is there a built-in function that looks like this?
(get-if map? b {})

【问题讨论】:

    标签: clojure


    【解决方案1】:

    如果可能的话,通常最好使用函数而不是宏:

    (defn get-if [pred v default]
      (if (pred v) v default))
    

    【讨论】:

      【解决方案2】:

      这个宏写起来很简单。我不认为这是惯用的,因为它增加了额外的抽象层而不增加可读性。阅读这样的代码的人必须查看宏来弄清楚发生了什么,而不是简单的 if。

      宏:

      (defmacro get-if
        [p v d]
        `(let [val# ~v]
           (if (~p val#)
             val#
             ~d)))
      

      如果您能详细介绍一下您的用例,或许我可以为您提供更多帮助?

      【讨论】:

      • 谢谢,我不希望目标表达式重复,但我发现我可以使用let 关键字删除重复。
      • 是的,这当然是惯用语。
      猜你喜欢
      • 2018-12-12
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      相关资源
      最近更新 更多