0

我正在编写一个可以输入字符串、数字、数组、Java 集合和映射的函数。约束是字符串和数字的输出都应该为零。

Clojure 函数计数可以满足我的所有需求,除了处理约束。因此,我想使用 if 语句来测试输入是字符串还是数字。如果测试为真,则返回零,否则使用 count。对于这两种情况,我都有可行的代码,但不知道如何将两者结合起来。此外,我不确定在这种情况下设置测试的最有效方法。

  (defn Swanson [a]
        (if (string? a) 0
        (count a)))

  (defn Propello [b]
        (if (instance? Number b) 0
        (count b)))
4

4 回答 4

1

如果清晰度比效率更重要(而且几乎总是如此),那么我会在这里使用 cond :

(cond
  (string? a) 0
  (instance? Number a) 0
  :default (count a))

有可能你真正想要的是“如果它是可数的则计数,否则为 0”。在这种情况下,“seq”功能可以提供帮助

(if (seq a) (count a) 0)

如果你真的关心性能,原则上用协议来做应该让你购买更多的 JVM 优化。但配置文件之前和之后,以确保!

(defprotocol SwansonPropello
  (swanson-propello [a]))

(extend-protocol SwansonPropello
  clojure.lang.ISeq
  (swanson-propello [a] (count a))

  clojure.lang.Seqable
  (swanson-propello [a] (count a))

  Object
  (swanson-propello [_] 0))
于 2013-11-06T05:25:54.000 回答
1

另外的选择:

(defn swanson-propello [x]
  (if (or (string? x)
          (number? x))
    0
    (count x)))

or是这种组合的最基本形式。它的文档字符串很好地描述了它:

Evaluates exprs one at a time, from left to right. If a form
returns a logical true value, or returns that value and doesn't
evaluate any of the other expressions, otherwise it returns the
value of the last expression. (or) returns nil.
于 2013-11-06T04:20:24.927 回答
0
(defn alex
  [obj]
  (cond
    (string? obj) 0
    (number? obj) 0
    :otherwise (count obj)))
于 2013-11-06T01:15:12.590 回答
0
#(if (string? %)
   0
   (count %))
于 2013-11-05T20:10:09.897 回答