【问题标题】:Check string length with variable in Clojure在 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 后,我的代码工作了......

标签: 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) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 2015-06-23
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多