【问题标题】:defining an optional with a default定义一个带默认值的可选
【发布时间】:2017-05-20 23:53:29
【问题描述】:

我正在尝试定义一个带有可选参数的函数,如果没有传入,每个可选参数也有一个默认值。 但我无法编译它,也无法在网上找到任何建议可行的方法。

这就是我所拥有的

defn test-optional-default-params [manA manB manC & [optA optB optC optD optE]
                                   :or {[optA optAdef
                                        optB optBdef
                                        optC optCdef
                                        optD optDdef
                                        optE optEdef]}]

(prn(str"manB->"manB",mnC->"manC",optA->"optA",optB->"optB",optC->"optC",optD->"optD", optE->" optE)))

【问题讨论】:

    标签: parameters clojure default optional


    【解决方案1】:

    你可以使用

    (defn f [a b & {:keys [c d e] :or {c defaultc d defaultd e defaulte}}]
      blabla)
    

    但你必须这样做

    (f 1 2 :c 3 :d 4 :e 5) 
    

    所以你也许可以做这样的事情(我尝试了一个基本功能:添加):

    (defn add-rest* [c d e]
      (+ c d e))
    
    (def add-rest*
      (fnil add-rest* 0 0 0))
    
    (defn add
      [a b & [c d e]]
      (+ a b (add-rest c d e)))
    
    (add 1 1) ;; 2
    (add 1 1 1) ;; 3
    (add 1 1 1 1) ;; 4
    

    【讨论】:

    • * 表示所有参数都是可选的吗?
    • 我想我更喜欢'f ab {:c c etc}'的第一个选项
    • 不,它只是一个“随机”名称
    【解决方案2】:

    您可以使用多参数函数,因此默认值为 0 的加法示例变为:

    (defn f+
      ([a b]        (f+ a b 0 0 0))
      ([a b c]      (f+ a b c 0 0))
      ([a b c d]    (f+ a b c d 0))
      ([a b c d e]  (+ a b c d e))) 
    

    将上面的 + 替换为五个变量的所需函数。 上面的用法变成:

    (f+ 1 2)         ;; 3
    (f+ 1 2 3)       ;; 6
    (f+ 1 2 3 4)     ;; 10
    (f+ 1 2 3 4 5)   ;; 15
    

    Note: also discussed previously with additional options

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-29
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多