在Clojure中使用变量检查字符串长度

Jel*_*lle 2 clojure

我想要一个用 Clojure 编写的函数,用于检查给定的 String 是否大于给定的数字,如果是,则我的函数为 true,否则为 false。现在我想出了以下代码,但它给出了以下错误:ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn user/checker (form-init1692807253513002836.clj:1)

我想出的代码是:

(defn checker [str, num] 
  (cond 
    (> (count str) num) "True"
    :else "False"
  )
) 
(checker "test" 6)
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么 count str 被视为 Long 和/或如何修复此函数吗?

Mic*_*ott 5

您可能希望通过考虑一些适用于您的代码段的 Clojure 习语来“修复”您的函数:

  • 内置布尔值;无需使用"True"/"False"字符串(除非您只是将它们用作其他内容的占位符示例)

  • 不需要明确返回布尔值,因为> 已经返回了一个布尔值

  • 您正在测量“长度”而不是“大”,因此请使用描述性的函数名称;strlen可能很常见

  • 因为布尔返回值你可以结束 ?

  • 可能避免str作为 var 名称

  • 根据Clojure推荐的元素,将比较顺序切换为使用<而不是 。>

考虑到这些,您的功能可以简化为:

(defn strlen-exceeds? [s n]
  (< n (count s)))
Run Code Online (Sandbox Code Playgroud)

(现在它足够短,您甚至可能不需要将它作为显式函数。)