【问题标题】:Iterating function arguments in ClojureClojure 中的迭代函数参数
【发布时间】:2020-02-06 18:32:00
【问题描述】:

我在迭代传递给以下函数的函数参数时遇到问题。

(defn iterateDates
  [& dates]
  (let [ukFormatter (java.time.format.DateTimeFormatter/ofPattern "dd-MM-yyyy")]
    (for [i [dates]]
      (java.time.LocalDate/parse i ukFormatter))))

(iterateDates "09-10-2019" "10-10-2019" "11-10-2019")

然而,当调用它时,会返回以下错误:

Error printing return value (ClassCastException) at clojure.core/getOldestDate$iter$fn$fn (core.clj:96).
clojure.lang.ArraySeq cannot be cast to java.lang.CharSequence

我不确定如何迭代传入的参数并将每个元素作为单独的值,然后可以将其传递给另一个函数。

我最终使用代码的目标是比较日期列表并找到其中最旧的日期。此代码只是尝试将每个参数解析为日期。

【问题讨论】:

  • 此代码不会运行。您在(for [i [dates)] 有一个括号不匹配。请发布实际代码。此外,for 的主体包裹在两对括号中,这将导致 parse 的返回被作为函数调用。这是你的意图吗?另外,请发布完整的堆栈跟踪。在第一次刷机时,该错误似乎并非源于此代码。
  • 我一直在 REPL 中运行它,这就是我得到错误的地方,正常运行它不会产生错误,但也不会产生输出。
  • 我想你的意思是(for [i dates]。我不知道这将如何导致该错误,但您现在将整个dates 序列传递给parse

标签: java clojure functional-programming


【解决方案1】:
(defn iterateDates
  [& dates]
  (let [ukFormatter (java.time.format.DateTimeFormatter/ofPattern "dd-MM-yyyy")]
    (for [i dates]
      (java.time.LocalDate/parse i ukFormatter))))

(iterateDates "09-10-2019" "10-10-2019" "11-10-2019")

这个版本应该可以工作。

您在原始代码中写了(for [i [dates]],它按您无意中指定的方式工作:

  1. 它使用dates 的向量[] 进行迭代,其中dates 已经是一个序列。
  2. 此向量的第一个元素是dates,即AraySeq
  3. java.time.LocalDate/parse 尝试将 ArraySeq 解析为 CharSequence 并失败。

【讨论】:

  • 非常感谢您的回答和解释。我现在意识到问题和代码确实有效。
【解决方案2】:

我想我会更新答案,因为我找到了另一种方法来实现这一点而无需迭代 args:

(defn iterateDates
  [& dates]
  (let [ukFormatter (java.time.format.DateTimeFormatter/ofPattern "dd-MM-yyyy")]
    (map #(java.time.LocalDate/parse % ukFormatter) dates)))

map 函数会将日期格式应用于日期的每个元素并将其作为新列表返回。

【讨论】:

    猜你喜欢
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    相关资源
    最近更新 更多