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

Posted

技术标签:

【中文标题】在 Clojure 中使用变量检查字符串长度【英文标题】:Check string length with variable in Clojure 【发布时间】:2018-03-22 09:20:47 【问题描述】:

我想要一个用 Clojure 编写的函数,它检查我给定的字符串是否大于给定的数字,如果是,我的函数说真,否则说假。 现在我想出了以下代码,但它给出了以下错误: ClassCastException java.lang.Long 无法转换为 clojure.lang.IFn 用户/检查器(form-init1692807253513002836.clj:1)

我想出的代码是:

(defn checker [str, num] 
  (cond 
    (> (count str) num) "True"
    :else "False"
  )
) 
(checker "test" 6)

谁能解释为什么 count str 被认为是 Long 和/或如何修复这个函数?

【问题讨论】:

我无法重现您的错误,您粘贴的示例似乎可以正常工作。造成这种情况的一个常见原因是编辑文件并需要加载它。在 emacs 中它是 C-k(默认情况下)在 InteliJ 中它是“加载命名空间” 嗯,你是对的,在我重新启动 Clojure 后,我的代码工作了...... 【参考方案1】:

你可能想通过考虑一些 Clojure 来“修复”你的函数 适用于您的 sn-p 的成语:

内置布尔值;无需使用"True"/"False" 字符串 (除非您只是将这些用作占位符示例 别的)

由于>,不需要明确返回布尔值 已经返回一个布尔值

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

由于布尔返回值可以以?结尾

可能避免将str 用作变量名称

根据Elements of Clojure 推荐,将比较顺序切换为使用< 而不是>

考虑到这些,您的函数可以简化为:

(defn strlen-exceeds? [s n]
  (< n (count s)))

(现在它已经足够短了,你甚至可能不需要它成为 显式函数。)

【讨论】:

【参考方案2】:

我认为您的代码应该可以工作,但是对于这种情况,不要使用 cond 使用 if

(defn checker [str, num] 
  (if (> (count str) num) 
     "True"
    "False")) 


> (checker "a" 1)
"False"
> (checker "a" 2)
"False"
> (checker "ab" 2)
"False"
> (checker "ab" 2) 

【讨论】:

以上是关于在 Clojure 中使用变量检查字符串长度的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 clojure 模式库在映射中使用字符串键验证值

Clojure 中惯用的字符串旋转

Clojure 的加载字符串在 repl 中有效,但在 `lein run` 中无效

在 clojure 中使用正则表达式实现一个简单的扫描器/标记器

在 Clojure 中,如何将字符串转换为数字?

为啥我不能在“|”处分开在clojure中[重复]