【问题标题】:Cannot have first parameter as optional不能将第一个参数作为可选参数
【发布时间】:2016-11-19 07:16:52
【问题描述】:

你能有一个函数,它的第一个也是唯一的参数是可选参数吗?

因此

(defn foo [& bar] (if (= bar) 1 2))

【问题讨论】:

  • (= x) 在 clojure 中总是true,不管x 是什么,只要x 不会通过抛出异常来中断表单的执行

标签: clojure clojurescript


【解决方案1】:

& bar 在函数定义中的意思是将所有其余参数放入一个列表中。它不保证列表的大小,因此它可以是空的,包含一个或多个项目。

拥有一个且唯一可选参数的更好方法是让它接受零个或一个参数:

(defn foo
   ([]    (foo 12))
   ([bar] (if (= bar 12) 1 2)))

在这个例子中,如果你调用第一个函数定义,零元,它只会调用第二个 1 元函数定义,默认值为 12。

【讨论】:

    【解决方案2】:

    这将起作用:

    (defn foo [& bar]
      (if (seq bar) 1 2))
    

    使用seq 是您应该编码“非空”的方式。不要与seq? 混淆,这意味着完全不同的东西,实际上会在这里返回true

    重要的一点是bar 变成了函数体内的一个列表。如果您想将此列表恢复为调用函数时的状态,请使用apply,或在函数本身中解构列表,如下面的 cmets 中所述...

    【讨论】:

    • 一个常见的模式是[& [bar]],它会破坏第一个参数并使其成为可选参数。
    • @ClojureMostly 但这会导致任何其他参数被静默忽略,这可能会导致像this 这样的细微错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2019-08-05
    • 2018-07-26
    • 2018-09-08
    • 2013-05-24
    • 2018-12-13
    相关资源
    最近更新 更多