在 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 的加载字符串在 repl 中有效,但在 `lein run` 中无效