【问题标题】:Clojure clojure.string/split hit java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.CharSequenceClojure clojure.string/split hit java.lang.ClassCastException: clojure.lang.LazySeq 不能转换为 java.lang.CharSequence
【发布时间】:2017-07-24 23:53:56
【问题描述】:

我尝试编写一个函数来通过调用 str\split 来处理一行字符串,如果我直接在 LEIN REPL 窗口中调用它,该函数可以正常工作,但是在尝试从 LEIN 运行程序时会遇到上述调用错误跑。 有什么建议吗?

(let [num-letters (count (apply str line))
      num-spaces-needed (- column-length num-letters)
      num-words (count  (clojure.string/split line #"\s"))
      num-space-in-group (if (= 1 num-words) num-spaces-needed (/ num-spaces-needed (- num-words 1)))
      group-of-spaces (repeat num-space-in-group " ")
      padding (create-list-spaces num-spaces-needed (dec (count line)))]
  (   clojure.string/join "" (if (empty? padding) (cons line group-of-spaces) 
                (cons (first line) (interleave (rest line) padding)))))

【问题讨论】:

  • 您能否准确说明您是如何使用lein repllein run 调用此代码的?

标签: clojure casting leiningen read-eval-print-loop charsequence


【解决方案1】:

我想你将line 作为参数传递给你的函数,尽管它在你的代码 sn-p 中被省略了。

从这两个不同的入口点调用函数时,您应该检查line 参数的差异。首先,为方便起见,我们将您的函数命名为tokenize。现在,在我添加 tokenize 调用后,Leiningen 中的香草 app 模板创建了一个看起来与此类似的 -main

(defn -main
  [& args]
  (tokenize args))

参数使用剩余运算符& 进行解构,该运算符构建参数的Seq (args)。因此,当使用lein run I want this to work! 运行它时,您最终会使用序列调用tokenize 函数。 clojure.string/split 不能应用于序列,你会得到一个堆栈跟踪。

但是,当您从 lein repl 调用您的函数时,一个自然的方法是使用像 (tokenize "Iä! Iä! Cthulhu fhtang!") 这样的咒语。这将起作用,因为您的调用参数现在只是一个字符串,而不是一个序列。

最后,它归结为你如何调用你的函数。正如@sam-estep 评论的那样,一个更自信的答案需要详细说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多