【问题标题】:Clojure function throwing arity exception when called from within a map从地图中调用Clojure函数时抛出arity异常
【发布时间】:2018-03-18 05:54:43
【问题描述】:
(map (fn [x]
    (let [username (or (:f_username x) nil)
          sites_names (SITES-NAMES username)
          x (assoc x :sites sites_names)]
     x)) my-rows)

在上面的代码中:SITES-NAMES 给了我一个 arity 异常。然而 如果我称它为(SITES-NAMES “theuser”),它就可以工作。为什么会这样 如果 username 评估为“theuser”的示例。

【问题讨论】:

  • 应该没有理由(从这里看到的),这个函数在 let 或它自己的行为中会表现不同。因此,请提供一个完整示例如何重现您看到的错误。
  • my_rows 包含什么内容?
  • SITES-NAMES的来源是什么?

标签: clojure


【解决方案1】:

我不知道为什么会这样,但这里有一些提示:

1) 使您的匿名函数成为顶级函数,例如:

(defn add-site [site-names {:keys [f-username] :as x}]
  (assoc x :sites (get site-names f-username)))

请注意我是如何命名变量的,请参阅 https://github.com/bbatsov/clojure-style-guide 了解有关命名和其他简洁内容的更多信息。

2) 现在您可以将呼叫更改为map

(map (partial add-site site-names) my-rows)

这让您可以像这样在 REPL 中使用 add-site 函数:

user> (add-site {"hector" "www.hector.com"} {:f-username "hector"})
;; => {:f-username "hector", :sites "www.hector.com"}

您可能还想阅读以下内容: https://stuartsierra.com/2015/08/10/clojure-donts-redundant-map

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2011-07-24
    相关资源
    最近更新 更多