【问题标题】:Cannot Figure Out How to Remove String cannot be cast to clojure.lang.IFn From Small Clojure Function无法弄清楚如何从小 Clojure 函数中删除字符串不能转换为 clojure.lang.IFn
【发布时间】:2020-01-21 20:54:43
【问题描述】:

我有一个小的 clojure 函数:

(defn split-legal-ref
  "Highly specific function that expects one AssessPro map and a map key,
   from which book and page will be extracted."
  [assess-pro-acct extract-key]
  (let [[book page] (cstr/split (extract-key assess-pro-acct) #"-")]
    (list (cstr/trim book) (cstr/trim page))))

鉴于:(extract-key assess-pro-acct) #"-")extract-key 的值为:legal_ref。因此,它从映射中获取像 927-48 这样的单个值,并使用“-”拆分该值。我只需要在没有这些好的价值之一时抓住它。这就是 split 返回 nil 的地方。

所以,我一直试图用以下内容替换原始功能。

(def missing-book 888)
(def missing-page 999)
.
.
.
(defn split-legal-ref
  "Highly specific function that expects one AssessPro map and a map key,
   from which book and page will be extracted."
  [assess-pro-acct extract-key]
    (let [[book page] (cstr/split (extract-key assess-pro-acct) #"-")]
     (let [[trimBook trimPage] ((if book (cstr/trim book) (missing-book))
                                        (if page (cstr/trim page)  (missing-page)))]
        (list (trimBook) (trimPage)))))

问题是我一直在害怕

String cannot be cast to clojure.lang.IFn From Small Clojure Function

错误。如何重构此函数以避免错误?

发布答案编辑:

感谢您的回答:

我重新设计了函数来测试字符串中的“-”。如果不存在,则在不存在时使用虚拟“888-99”作为值。

(def missing-book-page "888-99")
.
.
.

(defn split-legal-ref
  "Highly specific function that expects one AssessPro map and a map key,
   from which book and page will be extracted."
    [assess-pro-acct extract-key]
    (let [[book page] 
            (if (.contains "-" (extract-key assess-pro-acct))
            (cstr/split (extract-key assess-pro-acct) #"-")
            (cstr/split  missing-book-page #"-"))]
        (list (cstr/trim book) (cstr/trim page))))

【问题讨论】:

    标签: clojure


    【解决方案1】:

    在以((if book ... 开头的表达式周围有一组额外的括号。 if 表达式返回一个字符串,然后由于该字符串位于带有这两个括号外的列表的第一个位置,因此 Clojure 尝试将该字符串作为函数调用。

    括号在 Clojure 中非常非常重要。与 Fortran、C、C++、Java、Python 等语言中的算术表达式不同,在子表达式周围添加一组额外的括号是多余的,而且可能是不好的风格,但无害,它改变了 Clojure 表达式的含义。

    【讨论】:

    • 我不会称其为“额外的一组”括号,尽管通常这就是该错误的含义。相反,当应该使用方括号时,使用括号来生成二元素向量。一旦这个问题得到解决,更多的额外括号将给@octopusgrabbus 带来整数被称为函数的问题:(missing-book) 应该是missing-book
    • 基本上,我已经很久没有使用 Clojure 了,所以我使函数(添加到答案)更具可读性(至少对我来说),如果映射值仅返回一个空白字符串。感谢您回答这个问题。
    【解决方案2】:

    您能否添加更多信息,例如函数名称和示例数据?还包括更多错误消息。

    在您的代码中的某个地方,您试图将字符串当作函数来使用。例如:

    ("hello" 3)  ; should be (inc 3) or something.  This is line #6 
    

    这会产生以下错误

    ERROR in (dotest-line-5) (core.clj:6)
    Uncaught exception, not in assertion.
    expected: nil
      actual: java.lang.ClassCastException: class java.lang.String cannot be cast to class clojure.lang.IFn (java.lang.String is in module java.base of loader 'bootstrap'; clojure.lang.IFn is in unnamed module of loader 'app')
     at tst.demo.core$fn__18295.invokeStatic (core.clj:6)
    <snip>
    

    请注意,上面错误的最后一行是 core.clj:6,它与命名空间 tst.demo.core 和行号 6 匹配,其中 (hello 3) 在源代码中找到。

    【讨论】:

      猜你喜欢
      • 2013-11-18
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 2014-08-29
      • 2023-01-18
      相关资源
      最近更新 更多